界面编程的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); }
效果图: