
#define STRICT
#include <windows.h>
#include <stdio.h>

HINSTANCE g_hInst = 0;

LRESULT wnd_proc( HWND this_, UINT msg, WPARAM wp, LPARAM lp ) {

  static HWND cbox = 0;

  if ( msg == WM_CREATE ) {
    cbox = ::CreateWindowEx(
        0,
        "COMBOBOX",
        "",
        WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
        0,
        0,
        100,
        400,
        this_,
        NULL,
        g_hInst,
        0 );
    ::SendMessage( cbox, WM_SETFONT, (WPARAM)::GetStockObject(DEFAULT_GUI_FONT), 0 );
    ::SendMessage( cbox, CB_ADDSTRING, 0, (LPARAM)"アイテムその1" );
    ::SendMessage( cbox, CB_ADDSTRING, 0, (LPARAM)"アイテムその2" );
    ::SendMessage( cbox, CB_ADDSTRING, 0, (LPARAM)"アイテムその3" );
    ::SendMessage( cbox, CB_ADDSTRING, 0, (LPARAM)"アイテムその4" );
    ::SendMessage( cbox, CB_ADDSTRING, 0, (LPARAM)"アイテムその5(長い名前 長い名前 長い名前)" );
    ::SetTimer( this_, 1, 10, NULL );
    return 0;
  }

  if ( msg == WM_CLOSE ) {
    ::DestroyWindow( this_ );
    return 0;
  }

  if ( msg == WM_DESTROY ) {
    ::KillTimer( this_, 1 );
    ::PostQuitMessage(0);
    return 0;
  }

  if ( msg == WM_TIMER ) {
    RECT rc = { 120, 0, 300, 20 };
    ::RedrawWindow( this_, &rc, NULL, RDW_INVALIDATE );
    return 0;
  }

  if ( msg == WM_PAINT ) {
    PAINTSTRUCT ps;
    HDC dc = ::BeginPaint( this_, &ps );

    // クライアント領域 x 座標 100 ドット目にラインを引いてみる
    {
      HPEN pen = ::CreatePen( PS_SOLID, 1, RGB( 255,0,0 ) );
      HPEN old = (HPEN)::SelectObject( dc, pen );
      ::MoveToEx( dc, 100, 0, NULL );
      ::LineTo( dc, 100, 400 );
      ::SelectObject( dc, old );
      ::DeleteObject( pen );
    }

    // コンボボックスの大きさを表示
    {
      RECT rc;  ::GetWindowRect( cbox, &rc );
      ::OffsetRect( &rc, -rc.left, -rc.top );
      char buf[100];
      int len = sprintf( buf, "(%d,%d)-(%d,%d)", rc.left, rc.top, rc.right, rc.bottom );
      ::TextOut( dc, 120, 0, buf, len );
    }

    ::EndPaint( this_, &ps );
    return 0;
  }

  return ::DefWindowProc( this_, msg, wp, lp );
}

int __stdcall WinMain( HINSTANCE hinst, HINSTANCE, LPSTR, int ) {

  g_hInst = hinst;

  WNDCLASSEX wc = {
      sizeof WNDCLASSEX,
      CS_HREDRAW | CS_VREDRAW,
      (WNDPROC)wnd_proc,
      0, 0,
      g_hInst,
      ::LoadIcon( NULL, IDI_WINLOGO ),
      ::LoadCursor( NULL, IDC_ARROW ),
      (HBRUSH)::GetStockObject( WHITE_BRUSH ),
      NULL,
      "formclass_20030607",
      NULL };

  ATOM atom = ::RegisterClassEx( &wc );

  HWND form = ::CreateWindowEx(
      0,
      (LPCTSTR)atom,
      "main form",
      WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      CW_USEDEFAULT, CW_USEDEFAULT,
      CW_USEDEFAULT, CW_USEDEFAULT,
      NULL, NULL, g_hInst, 0 );

  MSG msg;
  while ( ::GetMessage( &msg, 0, 0, 0 ) > 0 ) {
    ::TranslateMessage( &msg );
    ::DispatchMessage( &msg );
  }

  return 0;
}



