直接用Win32 API创建对话框Demo
Win32 API包含有對話框函數;
Win10,CFree 5.0;新建一個窗口工程;
先看一下CFree自帶對話框編輯器;其保存為.DRES;還不知道怎么加入工程;先不管;
#include <windows.h> #include "resource.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DialogProc(HWND , UINT , WPARAM , LPARAM );HINSTANCE hInst; TCHAR szClassName[] = TEXT("createDialogDemo");int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_CREATEDIALOGDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("createDialogDemo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,200,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam; }LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;HDC hdc;RECT rt;int ret;HWND hWndDlg = NULL;switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_CreateDialog:hWndDlg = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_TESTDIALOG1), NULL, DialogProc, NULL);if(hWndDlg == NULL){MessageBox(NULL, "創建對話框失敗.", "", MB_OK);return 0;}break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("createDialogDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("createDialogDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam); }break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rt); EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0; }BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch(uMsg){case WM_INITDIALOG:MessageBox(NULL, "對話框初始化.", "", MB_OK);break;case WM_KEYDOWN:break; case WM_COMMAND:if(LOWORD(wParam) == IDOK){ }else if(LOWORD(wParam) == IDCANCEL){}return TRUE;case WM_CLOSE:DestroyWindow(hWnd);return TRUE;case WM_DESTROY:PostQuitMessage(0);return TRUE;}return FALSE; // 如果函數不處理消息,則對話框應用程序應該返回零值。 }創建對話框使用;
hWndDlg = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_TESTDIALOG1), NULL, DialogProc, NULL);
第一個參數是實例句柄,在文件頭部定義了全局變量,
HINSTANCE hInst;
在WinMain中對hInst賦值;CreateDialogParam函數需要一個對話框過程,過程要預先聲明;
BOOL CALLBACK DialogProc(HWND , UINT , WPARAM , LPARAM );
對話框過程中沒有處理代碼;只是在?WM_INITDIALOG 消息中彈出一個消息框;
程序運行如上圖;在?WM_INITDIALOG 消息中彈出了消息框;但是CreateDialogParam創建的對話框沒有顯示;下回再看;
CreateDialogParam第二個參數是對話框資源ID,MAKEINTRESOURCE(IDD_TESTDIALOG1);
單擊菜單時創建對話框;
頭文件和資源文件;
#define IDM_EXIT 10001 #define IDM_ABOUT 10002#define IDC_CREATEDIALOGDEMO 10101 #define IDD_ABOUTBOX 10102 #define IDM_CreateDialog 20001 #define IDD_TESTDIALOG1 1001 #include "resource.h" #include <windows.h>/ // // Menu //IDC_CREATEDIALOGDEMO MENU BEGINPOPUP "&File"BEGINMENUITEM "創建對話框", IDM_CreateDialogMENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND END// // Dialog //IDD_TESTDIALOG1 DIALOG DISCARDABLE 0, 0, 250, 75 CAPTION "測試對話框1" STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 9, "宋體" BEGINEND把下面兩句加到.rc文件,IDD_TESTDIALOG1中,BEGIN...END里面;會出錯;這兩句是從VC里面拷過來的;看上去沒問題;
? ? LTEXT ? ? ? ? ? "dialogDemo1 1.0 版",IDC_STATIC,40,10,119,8
? ? LTEXT ? ? ? ? ? "對話框測試",IDC_STATIC,40,25,119,8
工程如下;下回再看;
Win32 API 的 CreateDialogParam 說明如下:
?函數功能:該函數根據對話框模板資源創建一個無模式的對話框。在顯示對話框之前,函數把一個應用程序定義的值作為WM_INITDIALOG消息IParam參數傳到對話框過程應用程序可用此值來初始化對話框控制。
????函數原型:HWND CreateDialogParam(HINSTANCE hlnstancem,LPCTSTR IpTemplateName,HWND hWndParent,DLGPROCIpDialogFunc, LPARAM dwlniParam);
????參數:
????hlnstance:標識一個模塊的事例,該模塊的可執行文件含有對話框模板。
????IpTemplateName:標識對話框模板。此參數可以指向一個以NULL結尾的字符串的指針,該字符串指定對話框模板名,或是指定對話框模板的資源標識符的一個整型值。如果此參數指定了一個資源標識符,則它的高位字一定為零且低位字一定含有標識符。一定用MAKENTRESOURDE宏指令創建此值。
????HwndParent:指定擁有對話框的窗口。
????IpDialogFunc:指向對話框過程的指針。有關對話框過程的更詳細的信息,請參見DialogProc。
????dwlnitParam:指定傳遞到WM_INITDIALOG消息的IParam參數中的對話框過程的值。
????返回值:如果函數調用成功則返回值為指向對話框的窗口句柄。如果函數調用失敗則返回值為NULL。
????若想獲得更多錯誤信息,請調用GetlastError函數。
????備注:CreateoialogParam函數用 CreateWindowEx函數創建對話框。CreateDialogParam函數然后把一個WM_INITDIALOG消息(和一個WM_SETFONT消息,如果模板指定DS SETFONT類型)傳遞到對話框過程。如果模板指定WS_VISIBLE類型,則函數顯示對話框,最后CreateDialogParam返回對話框的窗口句柄。
????CreateDialogParam返回之后應用程序用ShowWindow顯示對話框(如果還沒有顯示)。應用程序用DestroyWindoW函數來清除對話框。
????Windows 95和以后版本:系統可支持每個對話框模板中最多255個控制。為把大于255個的控制放入對話框,需要在WM_INITDIALOG消息處理器中創建控制,而不是把他們放入模板中。
????Windows CE:IPTemplateName參數指向的對話框模板中DLGTEMPLATE結構并不支持所有的類型。
????速查:Windows NT:3.1 及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件;winuser.h;庫文件:use32.lib;Unicode:在Windows NT上實現為Unicode和ANSI兩種版本。
總結
以上是生活随笔為你收集整理的直接用Win32 API创建对话框Demo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超图空间数据模型概要1
- 下一篇: 超图桌面版区分不同类型数据源的图标