界面編程的CreateWindow函數需要instance,只要獲取到dll工程的main的instance參數,就可以使用CreateWindow函數了。
創建對話框需要CreateDialog函數。這個函數需要獲取對話框的界面資源。
所以需要先添加資源。
右鍵項目選擇添加資源,選擇IDD_FORMVIEW
之后會出現界面樣式編輯頁面,首先一個空白的對話框。
你可以選擇在上邊添加按鈕。選擇vs的視圖菜單,點擊工具箱,之后拖動控件添加按鈕即可。
之后編譯的話會出現錯誤。RC(8): error RC2144: PRIMARY LANGUAGE ID not a number
解決辦法:在在resource.h中加入#include <winresrc.h>
C++部分代碼:
(按鈕響應在DlgProc函數里寫,按鈕IDC_BUTTON1等都是資源文件里定義的。)
// 處理對話框消息 INT_PTR CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_BUTTON1: MessageBox(hdlg, L"您點擊了第一個按鈕。", L"提示", MB_OK | MB_ICONINFORMATION); break; case IDC_BUTTON2: MessageBox(hdlg, L"您點擊了第二個按鈕。", L"提示", MB_OK | MB_ICONINFORMATION); break; default: break; } } return 0; } return (INT_PTR)FALSE; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { // 創建對話框 HWND hdlg = CreateDialog(g_hinst, MAKEINTRESOURCE(IDD_FORMVIEW), hwnd, (DLGPROC)DlgProc); // 顯示對話框 ShowWindow(hdlg, SW_SHOWNA); } return 0; case WM_CLOSE: isContinue = 1; PostQuitMessage(0); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd,msg,wParam,lParam); } return 0; } DWORD WINAPI MyCreateDialog(LPVOID lpParamter) { // 設計窗口類 WNDCLASS wc = { }; wc.hbrBackground = (HBRUSH)COLOR_WINDOW; wc.lpfnWndProc = (WNDPROC)WindowProc; wc.lpszClassName = L"supper_man"; wc.hInstance = g_hinst; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); // 創建窗口 HWND hwnd = CreateWindow(L"supper_man", L"證書導入", WS_OVERLAPPEDWINDOW, 40, 25, 380, 300, NULL, NULL, g_hinst, NULL); if(!hwnd) return 0; ShowWindow(hwnd, 5); UpdateWindow(hwnd); // 消息循環 MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return TRUE; } VOID CreatDialogThread() { dialogThread = CreateThread(NULL, 0, MyCreateDialog, NULL, 0, NULL); }
效果圖: