Windows程序设计-模态对话框和非模态对话框

来源:互联网 发布:淘宝16年被扣24分 编辑:程序博客网 时间:2024/06/07 16:31

模态对话框

简单对话框

about1
About1.rc

///////////////////////////////////////////////////////////////////////////////// Dialog//ABOUTBOX DIALOGEX 32, 32, 180, 102STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUPFONT 8, "MS Sans Serif", 0, 0, 0x0BEGIN    DEFPUSHBUTTON   "OK",IDOK,66,81,50,14    ICON            "ABOUT1",IDC_STATIC,7,7,21,23    CTEXT           "About1",IDC_STATIC,40,12,100,8    CTEXT           "About Box Demo Program",IDC_STATIC,7,40,166,8    CTEXT           "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8END///////////////////////////////////////////////////////////////////////////////// Menu//ABOUT1 MENUBEGIN    POPUP "&Help"    BEGIN        MENUITEM "&About About1...",            IDM_APP_ABOUT    ENDEND

RESOURCE.H

#define IDM_APP_ABOUT                   40001
/*------------------------------------------   ABOUT1.C -- About Box Demo Program No. 1               (c) Charles Petzold, 1998   ------------------------------------------*/#include <windows.h>#include "resource.h"LRESULT CALLBACK WndProc      (HWND, UINT, WPARAM, LPARAM) ;BOOL    CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    PSTR szCmdLine, int iCmdShow){     static TCHAR szAppName[] = TEXT ("About1") ;     MSG          msg ;     HWND         hwnd ;     WNDCLASS     wndclass ;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;     wndclass.lpfnWndProc   = WndProc ;     wndclass.cbClsExtra    = 0 ;     wndclass.cbWndExtra    = 0 ;     wndclass.hInstance     = hInstance ;     wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;     wndclass.lpszMenuName  = szAppName ;     wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))     {          MessageBox (NULL, TEXT ("This program requires Windows NT!"),                      szAppName, MB_ICONERROR) ;          return 0 ;     }     hwnd = CreateWindow (szAppName, TEXT ("About Box Demo Program"),                          WS_OVERLAPPEDWINDOW,                          CW_USEDEFAULT, CW_USEDEFAULT,                          CW_USEDEFAULT, CW_USEDEFAULT,                          NULL, NULL, hInstance, NULL) ;     ShowWindow (hwnd, iCmdShow) ;     UpdateWindow (hwnd) ;      while (GetMessage (&msg, NULL, 0, 0))     {          TranslateMessage (&msg) ;          DispatchMessage (&msg) ;     }     return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     static HINSTANCE hInstance ;     switch (message)     {     case WM_CREATE :          hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;          return 0 ;     case WM_COMMAND :          switch (LOWORD (wParam))          {          case IDM_APP_ABOUT :               DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;               break ;          }          return 0 ;     case WM_DESTROY :          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,                             WPARAM wParam, LPARAM lParam){     switch (message)     {     case WM_INITDIALOG :          return TRUE ;     case WM_COMMAND :          switch (LOWORD (wParam))          {          case IDOK :          case IDCANCEL :               EndDialog (hDlg, 0) ;               return TRUE ;          }          break ;     }     return FALSE ;}

复杂对话框

about2
About2.rc

///////////////////////////////////////////////////////////////////////////////// Dialog//ABOUTBOX DIALOGEX 32, 32, 200, 234STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTIONFONT 8, "MS Sans Serif", 0, 0, 0x0BEGIN    ICON            "ABOUT2",IDC_STATIC,7,7,20,20    CTEXT           "About2",IDC_STATIC,57,12,86,8    CTEXT           "About Box Demo Program",IDC_STATIC,7,40,186,8    LTEXT           "",IDC_PAINT,114,67,72,72    GROUPBOX        "&Color",IDC_STATIC,7,60,84,143    RADIOBUTTON     "&Black",IDC_BLACK,16,76,64,8,WS_GROUP | WS_TABSTOP    RADIOBUTTON     "B&lue",IDC_BLUE,16,92,64,8    RADIOBUTTON     "&Green",IDC_GREEN,16,108,64,8    RADIOBUTTON     "Cya&n",IDC_CYAN,16,124,64,8    RADIOBUTTON     "&Red",IDC_RED,16,140,64,8    RADIOBUTTON     "&Magenta",IDC_MAGENTA,16,156,64,8    RADIOBUTTON     "&Yellow",IDC_YELLOW,16,172,64,8    RADIOBUTTON     "&White",IDC_WHITE,16,188,64,8    GROUPBOX        "&Figure",IDC_STATIC,109,156,84,46,WS_GROUP    RADIOBUTTON     "Rec&tangle",IDC_RECT,116,172,65,8,WS_GROUP | WS_TABSTOP    RADIOBUTTON     "&Ellipse",IDC_ELLIPSE,116,188,64,8    DEFPUSHBUTTON   "OK",IDOK,35,212,50,14,WS_GROUP    PUSHBUTTON      "Cancel",IDCANCEL,113,212,50,14,WS_GROUPEND///////////////////////////////////////////////////////////////////////////////// Icon//// Icon with lowest ID value placed first to ensure application icon// remains consistent on all systems.ABOUT2                  ICON                    "About2.ico"///////////////////////////////////////////////////////////////////////////////// Menu//ABOUT2 MENUBEGIN    POPUP "&Help"    BEGIN        MENUITEM "&About",                      IDM_APP_ABOUT    ENDEND///////////////////////////////////////////////////////////////////////////////// DESIGNINFO//#ifdef APSTUDIO_INVOKEDGUIDELINES DESIGNINFOBEGIN    "ABOUTBOX", DIALOG    BEGIN        LEFTMARGIN, 7        RIGHTMARGIN, 193        TOPMARGIN, 7        BOTTOMMARGIN, 227    ENDEND#endif    // APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// AFX_DIALOG_LAYOUT//ABOUTBOX AFX_DIALOG_LAYOUTBEGIN    0END#endif

RESOURCE.H

#define IDC_BLACK                       1000#define IDC_BLUE                        1001#define IDC_GREEN                       1002#define IDC_CYAN                        1003#define IDC_RED                         1004#define IDC_MAGENTA                     1005#define IDC_YELLOW                      1006#define IDC_WHITE                       1007#define IDC_RECT                        1008#define IDC_ELLIPSE                     1009#define IDC_PAINT                       1010#define IDM_APP_ABOUT                   40001

About2.c

/*------------------------------------------   ABOUT2.C -- About Box Demo Program No. 2               (c) Charles Petzold, 1998  ------------------------------------------*/#include <windows.h>#include "resource.h"LRESULT CALLBACK WndProc      (HWND, UINT, WPARAM, LPARAM) ;BOOL    CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;int iCurrentColor  = IDC_BLACK,    iCurrentFigure = IDC_RECT ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    PSTR szCmdLine, int iCmdShow){     static TCHAR szAppName[] = TEXT ("About2") ;     MSG          msg ;     HWND         hwnd ;     WNDCLASS     wndclass ;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;     wndclass.lpfnWndProc   = WndProc ;     wndclass.cbClsExtra    = 0 ;     wndclass.cbWndExtra    = 0 ;     wndclass.hInstance     = hInstance ;     wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;     wndclass.lpszMenuName  = szAppName ;     wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))     {          MessageBox (NULL, TEXT ("This program requires Windows NT!"),                      szAppName, MB_ICONERROR) ;          return 0 ;     }     hwnd = CreateWindow (szAppName, TEXT ("About Box Demo Program"),                          WS_OVERLAPPEDWINDOW,                          CW_USEDEFAULT, CW_USEDEFAULT,                          CW_USEDEFAULT, CW_USEDEFAULT,                          NULL, NULL, hInstance, NULL) ;     ShowWindow (hwnd, iCmdShow) ;     UpdateWindow (hwnd) ;      while (GetMessage (&msg, NULL, 0, 0))     {          TranslateMessage (&msg) ;          DispatchMessage (&msg) ;     }     return msg.wParam ;}void PaintWindow (HWND hwnd, int iColor, int iFigure){     static COLORREF crColor[8] = { RGB (  0,   0, 0), RGB (  0,   0, 255),                                    RGB (  0, 255, 0), RGB (  0, 255, 255),                                    RGB (255,   0, 0), RGB (255,   0, 255),                                    RGB (255, 255, 0), RGB (255, 255, 255) } ;     HBRUSH          hBrush ;     HDC             hdc ;     RECT            rect ;     hdc = GetDC (hwnd) ;     GetClientRect (hwnd, &rect) ;     hBrush = CreateSolidBrush (crColor[iColor - IDC_BLACK]) ;     hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;     if (iFigure == IDC_RECT)          Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ;     else          Ellipse   (hdc, rect.left, rect.top, rect.right, rect.bottom) ;     DeleteObject (SelectObject (hdc, hBrush)) ;     ReleaseDC (hwnd, hdc) ;}void PaintTheBlock (HWND hCtrl, int iColor, int iFigure){     InvalidateRect (hCtrl, NULL, TRUE) ;     UpdateWindow (hCtrl) ;     PaintWindow (hCtrl, iColor, iFigure) ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     static HINSTANCE hInstance ;     PAINTSTRUCT      ps ;     switch (message)     {     case WM_CREATE:          hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;          return 0 ;     case WM_COMMAND:          switch (LOWORD (wParam))          {          case IDM_APP_ABOUT:              // 激活对话框               if (DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc))                    InvalidateRect (hwnd, NULL, TRUE) ;               return 0 ;          }          break ;     case WM_PAINT:          BeginPaint (hwnd, &ps) ;          EndPaint (hwnd, &ps) ;          // 画图          PaintWindow (hwnd, iCurrentColor, iCurrentFigure) ;          return 0 ;     case WM_DESTROY:          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}// 对话框消息处理程序,返回布尔类型BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,                             WPARAM wParam, LPARAM lParam){     static HWND hCtrlBlock ;     static int  iColor, iFigure ;     switch (message)     {     // 对话框处理的第一个消息     case WM_INITDIALOG:          iColor  = iCurrentColor ;          iFigure = iCurrentFigure ;          // 设置单选按钮颜色状态 从IDC_BLACK到IDC_WHITE的一组          CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE,   iColor) ;          // 设置单选按钮形状状态 从IDC_RECT到IDC_ELLIPSE的一组          CheckRadioButton (hDlg, IDC_RECT,  IDC_ELLIPSE, iFigure) ;          // 获得窗口句柄          hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ;          SetFocus (GetDlgItem (hDlg, iColor)) ;          return FALSE ;     case WM_COMMAND:          switch (LOWORD (wParam))          {          case IDOK:               iCurrentColor  = iColor ;               iCurrentFigure = iFigure ;               EndDialog (hDlg, TRUE) ;               return TRUE ;          case IDCANCEL:               EndDialog (hDlg, FALSE) ;               return TRUE ;          case IDC_BLACK:          case IDC_RED:          case IDC_GREEN:          case IDC_YELLOW:          case IDC_BLUE:          case IDC_MAGENTA:          case IDC_CYAN:          case IDC_WHITE:               iColor = LOWORD (wParam) ;               CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, LOWORD (wParam)) ;               PaintTheBlock (hCtrlBlock, iColor, iFigure) ;               return TRUE ;          case IDC_RECT:          case IDC_ELLIPSE:               iFigure = LOWORD (wParam) ;               CheckRadioButton (hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ;               PaintTheBlock (hCtrlBlock, iColor, iFigure) ;               return TRUE ;          }          break ;     case WM_PAINT:          PaintTheBlock (hCtrlBlock, iColor, iFigure) ;          break ;     }     return FALSE ;}

定义自己的控件

about3
About3.rc

///////////////////////////////////////////////////////////////////////////////// Dialog//ABOUTBOX DIALOG DISCARDABLE  32, 32, 180, 100STYLE DS_MODALFRAME | WS_POPUPFONT 8, "MS Sans Serif"BEGIN    CONTROL         "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14    ICON            "ABOUT3",IDC_STATIC,7,7,20,20    CTEXT           "About3",IDC_STATIC,40,12,100,8    CTEXT           "About Box Demo Program",IDC_STATIC,7,40,166,8    CTEXT           "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8END///////////////////////////////////////////////////////////////////////////////// Menu//ABOUT3 MENU DISCARDABLE BEGIN    POPUP "&Help"    BEGIN        MENUITEM "&About About3...",            IDM_APP_ABOUT    ENDEND///////////////////////////////////////////////////////////////////////////////// DESIGNINFO//#ifdef APSTUDIO_INVOKEDGUIDELINES DESIGNINFO DISCARDABLE BEGIN    "ABOUTBOX", DIALOG    BEGIN        LEFTMARGIN, 7        RIGHTMARGIN, 173        TOPMARGIN, 7        BOTTOMMARGIN, 93    ENDEND#endif    // APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// Icon//// Icon with lowest ID value placed first to ensure application icon// remains consistent on all systems.ABOUT3                  ICON    DISCARDABLE     "icon1.ico"#endif

RESOURCE.H

#define IDM_APP_ABOUT                   40001#define IDC_STATIC                      -1

About3.c

/*------------------------------------------   ABOUT3.C -- About Box Demo Program No. 3               (c) Charles Petzold, 1998  ------------------------------------------*/#include <windows.h>#include "resource.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;BOOL    CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;LRESULT CALLBACK EllipPushWndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    PSTR szCmdLine, int iCmdShow){     static TCHAR szAppName[] = TEXT ("About3") ;     MSG          msg ;     HWND         hwnd ;     WNDCLASS     wndclass ;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;     wndclass.lpfnWndProc   = WndProc ;     wndclass.cbClsExtra    = 0 ;     wndclass.cbWndExtra    = 0 ;     wndclass.hInstance     = hInstance ;     wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;     wndclass.lpszMenuName  = szAppName ;     wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))     {          MessageBox (NULL, TEXT ("This program requires Windows NT!"),                      szAppName, MB_ICONERROR) ;          return 0 ;     }     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;     wndclass.lpfnWndProc   = EllipPushWndProc ;     wndclass.cbClsExtra    = 0 ;     wndclass.cbWndExtra    = 0 ;     wndclass.hInstance     = hInstance ;     wndclass.hIcon         = NULL ;     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;     wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;     wndclass.lpszMenuName  = NULL ;     wndclass.lpszClassName = TEXT ("EllipPush") ;     RegisterClass (&wndclass) ;     hwnd = CreateWindow (szAppName, TEXT ("About Box Demo Program"),                          WS_OVERLAPPEDWINDOW,                          CW_USEDEFAULT, CW_USEDEFAULT,                          CW_USEDEFAULT, CW_USEDEFAULT,                          NULL, NULL, hInstance, NULL) ;     ShowWindow (hwnd, iCmdShow) ;     UpdateWindow (hwnd) ;      while (GetMessage (&msg, NULL, 0, 0))     {          TranslateMessage (&msg) ;          DispatchMessage (&msg) ;     }     return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     static HINSTANCE hInstance ;     switch (message)     {     case WM_CREATE :          hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;          return 0 ;     case WM_COMMAND :          switch (LOWORD (wParam))          {          case IDM_APP_ABOUT :               DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;               return 0 ;          }          break ;     case WM_DESTROY :          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,                             WPARAM wParam, LPARAM lParam){     switch (message)     {     case WM_INITDIALOG :          return TRUE ;     case WM_COMMAND :          switch (LOWORD (wParam))          {          case IDOK :               EndDialog (hDlg, 0) ;               return TRUE ;          }          break ;     }     return FALSE ;}LRESULT CALLBACK EllipPushWndProc (HWND hwnd, UINT message,                                    WPARAM wParam, LPARAM lParam){     TCHAR       szText[40] ;     HBRUSH      hBrush ;     HDC         hdc ;     PAINTSTRUCT ps ;     RECT        rect ;     switch (message)     {     case WM_PAINT :          GetClientRect (hwnd, &rect) ;          GetWindowText (hwnd, szText, sizeof (szText)) ;          hdc = BeginPaint (hwnd, &ps) ;          hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW)) ;          hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;          SetBkColor (hdc, GetSysColor (COLOR_WINDOW)) ;          SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT)) ;          Ellipse (hdc, rect.left, rect.top, rect.right, rect.bottom) ;          DrawText (hdc, szText, -1, &rect,                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;          DeleteObject (SelectObject (hdc, hBrush)) ;          EndPaint (hwnd, &ps) ;          return 0 ;     case WM_KEYUP :          if (wParam != VK_SPACE)               break ;                                             // fall through     case WM_LBUTTONUP :         // GetParent获得父窗口句柄         // 消息的wParam等于控件的ID,使用GetWindowLong获得          SendMessage (GetParent (hwnd), WM_COMMAND,               GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}

非模态对话框

非模态对话框允许使用者在对话框与其它程序之间进行切换,又可以在对话框与建立对话框的窗口之间进行切换。

模态对话框是用DialogBox来建立的。只有在清除对话框之后,函数才会传回值。在对话框程序内使用EndDialog呼叫来终止对话框,DialogBox传回的是该呼叫的第二个参数的值。非模态对话框是使用CreateDialog来建立的,该函数所使用的参数与DialogBox相同。

hDlgModeless = CreateDialog ( hInstance, szTemplate, hwndParent, DialogProc) ;

区别是CreateDialog函数立即传回对话框的窗口句柄,并通常将这个窗口句柄存放到整体变量中。

尽管将DialogBox这一名字用于模态对话框而CreateDialog用于非模态对话框是随意的,但是您可以通过非模态对话框与普通窗口类似这一点来记住这两个函数的区别。CreateDialog可以令人想起CreateWindow函数来,而后者建立的是普通窗口。

模态对话框与非模态对话框的区别

  • 非模态对话框通常包含一个标题列和一个系统菜单按钮。用于非模态对话框的对话框模板中的STYLE叙述形如:STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
  • 非模态对话框的STYLE叙述中包含有WS_VISIBLE样式。如 果 省 略 了 WS_VISIBLE , 那 么 您 必 须 在 CreateDialog 呼 叫 之 后 呼 叫ShowWindow,否则不会显示。
  • 非模态对话框的消息要经过程序的消息队列。要将这些消息传送给对话框窗口消息处理程序,则必须改变消息队列。

方法如下:当您使用CreateDialog建立非模态对话框时,应该将从呼叫中传回的对话框句柄储存在一个整体变量(如hDlgModeless)中,并将消息循环改变为:

while (GetMessage (&msg, NULL, 0, 0)){if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}}

加上快捷键后:

while (GetMessage (&msg, NULL, 0, 0)){if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg)){if (!TranslateAccelerator (hwnd, hAccel, &msg)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}}}

调色板

colors2
Colors2.rc

///////////////////////////////////////////////////////////////////////////////// Dialog//COLORSCRDLG DIALOG DISCARDABLE  16, 16, 120, 141STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTIONCAPTION "Color Scroll Scrollbars"FONT 8, "MS Sans Serif"BEGIN    CTEXT           "&Red",IDC_STATIC,8,8,24,8,NOT WS_GROUP    SCROLLBAR       10,8,20,24,100,SBS_VERT | WS_TABSTOP    CTEXT           "0",13,8,124,24,8,NOT WS_GROUP    CTEXT           "&Green",IDC_STATIC,48,8,24,8,NOT WS_GROUP    SCROLLBAR       11,48,20,24,100,SBS_VERT | WS_TABSTOP    CTEXT           "0",14,48,124,24,8,NOT WS_GROUP    CTEXT           "&Blue",IDC_STATIC,89,8,24,8,NOT WS_GROUP    SCROLLBAR       12,89,20,24,100,SBS_VERT | WS_TABSTOP    CTEXT           "0",15,89,124,24,8,NOT WS_GROUPEND///////////////////////////////////////////////////////////////////////////////// DESIGNINFO//#ifdef APSTUDIO_INVOKEDGUIDELINES DESIGNINFO DISCARDABLE BEGIN    "COLORSCRDLG", DIALOG    BEGIN        LEFTMARGIN, 7        RIGHTMARGIN, 113        TOPMARGIN, 7        BOTTOMMARGIN, 134    ENDEND#endif

RESOURCE.H

#define IDC_STATIC                      -1
/*------------------------------------------------   COLORS2.C -- Version using Modeless Dialog Box                (c) Charles Petzold, 1998  ------------------------------------------------*/#include <windows.h>LRESULT CALLBACK WndProc     (HWND, UINT, WPARAM, LPARAM) ;BOOL    CALLBACK ColorScrDlg (HWND, UINT, WPARAM, LPARAM) ;HWND hDlgModeless ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    PSTR szCmdLine, int iCmdShow){     static TCHAR szAppName[] = TEXT ("Colors2") ;     HWND         hwnd ;     MSG          msg ;     WNDCLASS     wndclass ;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;     wndclass.lpfnWndProc   = WndProc ;     wndclass.cbClsExtra    = 0 ;     wndclass.cbWndExtra    = 0 ;     wndclass.hInstance     = hInstance ;     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;     wndclass.hbrBackground = CreateSolidBrush (0L) ;     wndclass.lpszMenuName  = NULL ;     wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))     {          MessageBox (NULL, TEXT ("This program requires Windows NT!"),                      szAppName, MB_ICONERROR) ;          return 0 ;     }     hwnd = CreateWindow (szAppName, TEXT ("Color Scroll"),                          WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,                          CW_USEDEFAULT, CW_USEDEFAULT,                          CW_USEDEFAULT, CW_USEDEFAULT,                          NULL, NULL, hInstance, NULL) ;     ShowWindow (hwnd, iCmdShow) ;     UpdateWindow (hwnd) ;     hDlgModeless = CreateDialog (hInstance, TEXT ("ColorScrDlg"),                                   hwnd, ColorScrDlg) ;     while (GetMessage (&msg, NULL, 0, 0))     {         // IsDialogMessage发送非模态对话框消息          if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))          {               TranslateMessage (&msg) ;               DispatchMessage  (&msg) ;          }     }     return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     switch (message)     {     case WM_DESTROY :          DeleteObject ((HGDIOBJ) SetClassLong (hwnd, GCL_HBRBACKGROUND,                              (LONG) GetStockObject (WHITE_BRUSH))) ;          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}BOOL CALLBACK ColorScrDlg (HWND hDlg, UINT message,                            WPARAM wParam, LPARAM lParam){     static int iColor[3] ;     HWND       hwndParent, hCtrl ;     int        iCtrlID, iIndex ;     switch (message)     {     case WM_INITDIALOG :          for (iCtrlID = 10 ; iCtrlID < 13 ; iCtrlID++)          {               hCtrl = GetDlgItem (hDlg, iCtrlID) ;               SetScrollRange (hCtrl, SB_CTL, 0, 255, FALSE) ;               SetScrollPos   (hCtrl, SB_CTL, 0, FALSE) ;          }          return TRUE ;     case WM_VSCROLL :          hCtrl   = (HWND) lParam ;          iCtrlID = GetWindowLong (hCtrl, GWL_ID) ;          iIndex  = iCtrlID - 10 ;          hwndParent = GetParent (hDlg) ;          switch (LOWORD (wParam))          {          case SB_PAGEDOWN :               iColor[iIndex] += 15 ;        // fall through          case SB_LINEDOWN :               iColor[iIndex] = min (255, iColor[iIndex] + 1) ;               break ;          case SB_PAGEUP :               iColor[iIndex] -= 15 ;        // fall through          case SB_LINEUP :               iColor[iIndex] = max (0, iColor[iIndex] - 1) ;               break ;          case SB_TOP :               iColor[iIndex] = 0 ;               break ;          case SB_BOTTOM :               iColor[iIndex] = 255 ;               break ;          case SB_THUMBPOSITION :          case SB_THUMBTRACK :               iColor[iIndex] = HIWORD (wParam) ;               break ;          default :               return FALSE ;          }          SetScrollPos  (hCtrl, SB_CTL,      iColor[iIndex], TRUE) ;          // 设置静态资源颜色值大小          SetDlgItemInt (hDlg,  iCtrlID + 3, iColor[iIndex], FALSE) ;          DeleteObject ((HGDIOBJ) SetClassLong (hwndParent, GCL_HBRBACKGROUND,                              (LONG) CreateSolidBrush (                                   RGB (iColor[0], iColor[1], iColor[2])))) ;          InvalidateRect (hwndParent, NULL, TRUE) ;          return TRUE ;     }     return FALSE ;}

十六进制计算器

计算器
HexCalc.rc

///////////////////////////////////////////////////////////////////////////////// Icon//// Icon with lowest ID value placed first to ensure application icon// remains consistent on all systems.HEXCALC                 ICON    DISCARDABLE     "HexCalc.ico"#endif    // English (U.S.) resources/////////////////////////////////////////////////////////////////////////////#ifndef APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// Generated from the TEXTINCLUDE 3 resource.//#include "hexcalc.dlg"/////////////////////////////////////////////////////////////////////////////#endif    // not APSTUDIO_INVOKED

HexCalc.dlg

/*---------------------------   HEXCALC.DLG dialog script  ---------------------------*/HexCalc DIALOG -1, -1, 102, 122STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOXCLASS "HexCalc"CAPTION "Hex Calculator"{     PUSHBUTTON "D",       68,  8,  24, 14, 14     PUSHBUTTON "A",       65,  8,  40, 14, 14     PUSHBUTTON "7",       55,  8,  56, 14, 14     PUSHBUTTON "4",       52,  8,  72, 14, 14     PUSHBUTTON "1",       49,  8,  88, 14, 14     PUSHBUTTON "0",       48,  8, 104, 14, 14     PUSHBUTTON "0",       27, 26,   4, 50, 14     PUSHBUTTON "E",       69, 26,  24, 14, 14     PUSHBUTTON "B",       66, 26,  40, 14, 14     PUSHBUTTON "8",       56, 26,  56, 14, 14     PUSHBUTTON "5",       53, 26,  72, 14, 14     PUSHBUTTON "2",       50, 26,  88, 14, 14     PUSHBUTTON "Back",     8, 26, 104, 32, 14     PUSHBUTTON "C",       67, 44,  40, 14, 14     PUSHBUTTON "F",       70, 44,  24, 14, 14     PUSHBUTTON "9",       57, 44,  56, 14, 14     PUSHBUTTON "6",       54, 44,  72, 14, 14     PUSHBUTTON "3",       51, 44,  88, 14, 14     PUSHBUTTON "+",       43, 62,  24, 14, 14     PUSHBUTTON "-",       45, 62,  40, 14, 14     PUSHBUTTON "*",       42, 62,  56, 14, 14     PUSHBUTTON "/",       47, 62,  72, 14, 14     PUSHBUTTON "%",       37, 62,  88, 14, 14     PUSHBUTTON "Equals",  61, 62, 104, 32, 14     PUSHBUTTON "&&",      38, 80,  24, 14, 14     PUSHBUTTON "|",      124, 80,  40, 14, 14     PUSHBUTTON "^",       94, 80,  56, 14, 14     PUSHBUTTON "<",       60, 80,  72, 14, 14     PUSHBUTTON ">",       62, 80,  88, 14, 14}

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 ;     }     // 第二个参数:对话框模板名称     // 第三个参数:父窗口句柄,没有父窗口设置为0     // 第四个参数:对话框地址,这里不需要     // 这相当于调用CreateWindow     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){    // 没有包含资源头文件,是因为按键控件ID和空间上文字ASCII码一一对应     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 = '=' ;          // GetDlgItem获取模板中定义的ID来判断按钮是否有效          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) ;}
原创粉丝点击