非模态对话框

来源:互联网 发布:循环算法的时间复杂度 编辑:程序博客网 时间:2024/06/15 07:26
    对话框分为模态的和非模态的,常见的是模态对话框,通常可以在资源文件中新建一个对话框,然后再WinMain函数中调用DialogBox来显示对话框,当模态对话框未关闭时,不可以对主窗口进行操作,必须将其关闭才可以,非模态对话框则不必,非模态对话框一般用CreateDialog创建,windows程序设计第五版中有一个HexCalc小程序,它不是在资源文件中新建对话框模板的,而是用一种新的方式,之前没用过,所有折腾了一点时间,觉得还是有必要写下来    新建一个空项目后,添加源文件,然后添加图标资源,作为程序的图标HexCalc.cpp:
/*----------------------------------------HEXCALC.C -- Hexadecimal Calculator(c) Charles Petzold, 1998----------------------------------------*//*//HEXCALC.DLG dialog script//这是HesCalc.dlg里面的内容HexCalc DIALOG 100, 100, 102, 122STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOXCLASS "HexCalc"CAPTION "Hex Calculator"{            按钮      按钮文本 ID(ascii码) x y width height        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        //这是显示结果的按钮,初始时为0,#define VK_ESCAPE         0x1B        //按下equal键时就改变该按钮的文本,0x1B是十进制27        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}*/#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 = TEXT("hexcalc");    if (!RegisterClass(&wndclass))    {        MessageBox(NULL, TEXT("This program requires Windows NT!"),            szAppName, MB_ICONERROR);        return 0;    }    //没有父窗口,窗口类为szAppName    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);    //这样做并不太好,容易误导,第二个参数是控制的ID,HexCalc.dlg里定义显示结果的按钮的ID为27,    //正好是VK_ESCAPE,作者的意图是按下esc键相当于按下该按钮,进行复位    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;   //#define VK_BACK           0x08        // fall through    case WM_CHAR:        //#define VK_RETURN         0x0D        //按下回车键相当于按下=键        if ((wParam = (WPARAM)CharUpper((TCHAR *)wParam)) == VK_RETURN)            wParam = '=';        if (hButton = GetDlgItem(hwnd, wParam))        {            SendMessage(hButton, BM_SETSTATE, 1, 0);            //不暂停的话按键看不出弹出效果,比如按1等            Sleep(100);            SendMessage(hButton, BM_SETSTATE, 0, 0);        }        else        {            MessageBeep(0);            break;        }        // fall through    case WM_COMMAND:        //wParam是控制的ID,正好上面HesCalc.dlg里非模态对话框是将其ASCII码作为ID的        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);}

怎么添加对话框模板呢?书上是这样说的
这里写图片描述
书上讲的并不是特别清楚,不过也知道了大概,点击vs的“文件-新建-
文件”
这里写图片描述
选择文本文件
这里写图片描述
然后将下面的文本复制进去:

//HEXCALC.DLG dialog script//这是HesCalc.dlg里面的内容HexCalc DIALOG 100, 100, 102, 122STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOXCLASS "HexCalc"CAPTION "Hex Calculator"{            按钮      按钮文本 ID(ascii码) x y width height        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        //这是显示结果的按钮,初始时为0,#define VK_ESCAPE         0x1B        //按下equal键时就改变该按钮的文本,0x1B是十进制27        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.dlg”
然后,点击资源视图-右击资源文件-资源包括
这里写图片描述
然后做一些修改即可
这里写图片描述
现在运行一下程序,
这里写图片描述
成功了,之前难就难在没用这种方式创建过对话框模板,然后一运行,看不到程序,但在任务管理器上可以找到
顺便再说一下,窗口的类名和窗口类必须相同,不然也会看不到窗口,试了下,如果仅仅大小写不同,也是可以的
这里写图片描述

0 0
原创粉丝点击