walnutcy

基于Win32的Dialog

0
阅读(9214)

最近在学WinCE,就拿VC的Win32来练练手,初学第一个工程是基于Win32的Dialog,首先创建模式对话框,并注册消息处理函数。

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 INITCOMMONCONTROLSEX icex;

 // Ensure that the common control DLL is loaded.
 icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
 icex.dwICC  = ICC_LISTVIEW_CLASSES|ICC_TAB_CLASSES|ICC_LISTVIEW_CLASSES;
 InitCommonControlsEx(&icex);

 g_hInstance = hInstance;

 //------------ Prevent multiple instance  ------------------
 HANDLE hMutex = CreateMutex(NULL,FALSE,APPNAME);

 if( GetLastError() == ERROR_ALREADY_EXISTS )
 {
      HWND hwndPrev = FindWindow( L"Dialog" , APPNAME );
      if( hwndPrev )
      {
             ShowWindow(hwndPrev, SW_SHOWNORMAL);
             SetForegroundWindow(hwndPrev);
        }
        return 0;
    }

    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, (DLGPROC)  DlgProc);
    return 0;
}

static BOOL CALLBACK DlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
#if TRACE_DEBUG_USE
 TRACE(_T("MSG = 0x%08X),wParam = 0x%08X, lParam = 0x%08X\n"), Msg, (DWORD)wParam,(DWORD)lParam);
#endif
 switch(Msg)
 {
// ----------------------------------------------------------
 case WM_INITDIALOG:
 {
  g_hDlgHwnd = hDlg;
  DlgLayout(hDlg);  // 排布对话框
  memset(&g_LCDMemory[0][0],0x00,APP_LCD_Wbyte*APP_LCD_H);;
  InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_LCD), NULL, FALSE);// 画按钮
  break;
 }
// ----------------------------------------------------------
 case WM_NOTIFY:
  break;
// ----------------------------------------------------------
 case WM_SIZE:
 {
  RECT rt;
  SetRect(&rt, 0, 0, LOWORD(lParam), HIWORD(lParam));
  break;
 }
 case WM_DRAWITEM:
 {
  LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
  if (lpdis) DrawGraph(lpdis->hwndItem);
  return TRUE;
 }
// ----------------------------------------------------------
 case WM_COMMAND:
  switch(LOWORD(wParam))
  {
  case IDOK:
   return TRUE;
  case IDCANCEL:
   return TRUE;
  case IDC_BUTTON_UP:
   CInitWindow(0x44);
   InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_LCD), NULL, FALSE);
   return TRUE;
  case IDC_BUTTON_DOWN:
   CInitWindow(0x66);
   InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_LCD), NULL, FALSE);
   return TRUE;
  case IDC_BUTTON_LEFT:
   CInitWindow(0x77);
   InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_LCD), NULL, FALSE);
   return TRUE;
  case IDC_BUTTON_RIGHT:
   CInitWindow(0x00);
   InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_LCD), NULL, FALSE);
   return TRUE;
  case IDC_BUTTON_BACK:
   CInitWindow(0x22);
   InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_LCD), NULL, FALSE);
   return TRUE;
  case IDC_BUTTON_ENTER:
   CInitWindow(0xFF);
   InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_LCD), NULL, FALSE);
   return TRUE;
  }
  break;
// ----------------------------------------------------------
 case WM_SYSCOMMAND:
 {
  switch((DWORD)wParam)
  {
  case SC_CONTEXTHELP: // XP下用这个消息显示About,WinCE下是另外一个
   DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hDlg, (DLGPROC)DlgProcHelp);
   return TRUE;
  case SC_CLOSE:
   break;
  case SC_MINIMIZE:
   break;
  case SC_MAXIMIZE:
   break;
  }
  break;
 }
// ----------------------------------------------------------
 case WM_TIMER:
  break;
// ----------------------------------------------------------
 case WM_CLOSE:
  EndDialog(hDlg, 0); // 关闭对话框
  DestroyWindow(hDlg);
  g_hDlgExist = FALSE;
  return TRUE;
// ----------------------------------------------------------
 case WM_DESTROY:
  return FALSE;
 }
 return FALSE;
}