设为首页 加入收藏

TOP

二、Windows非模态对话框—HEXCALC:窗口还是对话框?
2012-11-05 12:36:43 】 浏览:497
Tags:Windows 模态 对话 HEXCALC 窗口 还是

HEXCALC程序可能是写程序偷懒的经典之作,如程序11-5所示。这个程序完全不呼叫CreateWindow,也不处理WM_PAINT消息,不取得设备内容,也不处理鼠标消息。但是它只用了不到150行的原始码,就构成了一个具有完整键盘和鼠标接口以及10种运算的十六进制计算器。计算器如图11-5所示。

程序11-5 HEXCALC
        HEXCALC.C        /*------------------------------------------------------------------------          HEXCALC.C -- Hexadecimal Calculator                                          (c) Charles Petzold, 1998        -------------------------------------------------------------------------*/        #include <windows.h>        LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;        int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                                                                 PSTR szCmdLine, int iCmdShow)        {                   static TCHAR szAppName[] = TEXT ("HexCalc") ;                   HWND                          hwnd ;                   MSG                           msg ;                   WNDCLASS                      wndclass ;                              wndclass.style                               = CS_HREDRAW | CS_VREDRAW;                   wndclass.lpfnWndProc                         = WndProc ;                   wndclass.cbClsExtra                          = 0 ;                   wndclass.cbWndExtra                          = DLGWINDOWEXTRA ;                // Note!                   wndclass.hInstance                           = hInstance ;                   wndclass.hIcon                               = LoadIcon (hInstance, szAppName) ;                   wndclass.hCursor                             = LoadCursor (NULL, IDC_ARROW) ;                   wndclass.hbrBackground               = (HBRUSH) (COLOR_BTNFACE + 1) ;                   wndclass.lpszMenuName                = NULL ;                   wndclass.lpszClassName               = szAppName ;                              if (!RegisterClass (&wndclass))            {                          MessageBox (  NULL, TEXT ("This program requires Windows NT!"),                                                                                szAppName, MB_ICONERROR) ;                          return 0 ;                   }                              hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;                   ShowWindow (hwnd, iCmdShow) ;                   while (GetMessage (&msg, NULL, 0, 0))                   {                                  TranslateMessage (&msg) ;                                  DispatchMessage (&msg) ;            }                   return msg.wParam ;        }        void ShowNumber (HWND hwnd, UINT iNumber)        {                   TCHAR szBuffer[20] ;                   wsprintf (szBuffer, TEXT ("%X"), iNumber) ;                   SetDlgItemText (hwnd, VK_ESCAPE, szBuffer) ;        }        DWORD CalcIt (UINT iFirstNum, int iOperation, UINT iNum)        {            switch (iOperation)                   {                   case '=': return iNum ;                   case '+': return iFirstNum +  iNum ;                   case '-': return iFirstNum -  iNum ;                   case '*': return iFirstNum *  iNum ;                   case '&': return iFirstNum &  iNum ;                   case '|': return iFirstNum |  iNum ;                   case '^': return iFirstNum ^  iNum ;                   case '<': return iFirstNum << iNum ;                   case '>': return iFirstNum >> iNum ;                   case '/': return iNum   iFirstNum / iNum: MAXDWORD ;                   case '%': return iNum   iFirstNum % iNum: MAXDWORD ;                   default : return 0 ;                   }        }        LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)        {                   static BOOL  bNewNumber = TRUE ;                   static int   iOperation = '=' ;                  static UINT   iNumber, iFirstNum ;                   HWND                                 hButton ;                              switch (message)                   {                   case WM_KEYDOWN:                   // left arrow --> backspace                          if (wParam != VK_LEFT)                                                 break ;                          wParam = VK_BACK ;                   // fall through          case   WM_CHAR:                          if     ((wParam = (WPARAM) CharUpper ((TCHAR *) wParam)) == VK_RETURN)                                                 wParam = '=' ;                                          if     (hButton = GetDlgItem (hwnd, wParam))                          {                                          SendMessage (hButton, BM_SETSTATE, 1, 0) ;                                          Sleep (100) ;                                          SendMessage (hButton, BM_SETSTATE, 0, 0) ;                          }                          else                          {                                         MessageBeep (0) ;                                          break ;                          }                       // fall through                   case   WM_COMMAND:                          SetFocus (hwnd) ;                                          if (LOWORD (wParam) == VK_BACK)                 //backspace                                                 ShowNumber (hwnd, iNumber /= 16) ;                                          else if (LOWORD (wParam) == VK_ESCAPE)               // escape                                                ShowNumber (hwnd, iNumber = 0) ;                                          else if (isxdigit (LOWORD (wParam)))                 // hex digit                 {                                                if (bNewNumber)                                                 {                                                         iFirstNum = iNumber ;                                                         iNumber = 0 ;                                         }                                          bNewNumber = FALSE ;                                  if     (iNumber <= MAXDWORD >> 4)                                                ShowNumber (hwnd, iNumber = 16 * iNumber + wParam -                                                 (isdigit (wParam)   '0': 'A' - 10)) ;                                  else                                               MessageBeep (0) ;                          }                          else    // operation                 {                                         if (!bNewNumber)                           ShowNumber (hwnd, iNumber =                               CalcIt (iFirstNum, iOperation, iNumber)) ;                                         bNewNumber = TRUE ;                                          iOperation = LOWORD (wParam) ;                          }                         return 0 ;                   case   WM_DESTROY:                          PostQuitMessage (0) ;                          return 0 ;          }                   return DefWindowProc (hwnd, message, wParam, lParam) ;        }        
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇三、Windows通用对话框 下一篇二、Windows非模态对话框—新的CO..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目