c++ - 无法使用 CreateWindowEx 函数创建窗口
问题描述
我无法使用下面的代码创建窗口,尽管我在编译中没有错误。只出现一个带有我的项目名称标题的窗口。我还在调用hwnd=NULL
后设置CreateWindowEx
以查看是否MessageBox
有效,但它也不起作用。
#include <windows.h>
#include <StdAfx.h>
const char* myClassName="myWindowsClassName";
//The window procedure
LRESULT CALLBACK WndProc( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam){
switch(msg){
case WM_CLOSE:
DestroyWindow( hwnd );
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc( hwnd , msg , wParam , lParam );
}
return 0;
}
//Registering window
int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lPCmdLine , int nCmdShow ){
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
wc.cbSize=sizeof( WNDCLASSEX );
wc.style=0;
wc.lpfnWndProc= WndProc;
wc.cbClsExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon( NULL , IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL , IDC_ARROW);
wc.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
wc.lpszClassName= (LPCWSTR) myClassName;
wc.hIconSm=LoadIcon( NULL , IDI_APPLICATION );
if( !RegisterClassEx( &wc ) ){
MessageBox( NULL ,L"Window registeration failed" ,L"Error!" , MB_ICONEXCLAMATION | MB_OK );
return 0;
}
//Creating the window
hwnd=CreateWindowEx( WS_EX_CLIENTEDGE , (LPCWSTR)myClassName , L"The title of my window" , WS_OVERLAPPEDWINDOW , CW_USEDEFAULT , CW_USEDEFAULT, 320 , 240 , NULL , NULL , hInstance , NULL );
hwnd=NULL;
if( hwnd==NULL ){
MessageBox( NULL ,L"Window creation failed",L"Error!", MB_ICONEXCLAMATION | MB_OK );
return 0;
}
ShowWindow ( hwnd , nCmdShow );
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
问题出在哪里?
谢谢
解决方案
Unicode 与 ANSI 不匹配?
myClassName
是char*
,但您将其转换为(LPCWSTR)
. 如果您正在编译为 Unicode(并且您应该),那么您应该将类名定义为const WCHAR* myClassName=L"myWindowsClassName";
并删除强制转换(或使用const_cast<LPTSTR>()
.
您也无法初始化.cbWndExtra
. 更改WNDCLASSEX wc;
为WNDCLASSEX wc = {};
您应该执行更好的错误检查来诊断故障。检查 MSDN 以查看函数在失败时是否设置了最后一个错误。如果是,则GetLastError()
在函数失败后调用。
推荐阅读
- javascript - 如何让 Google 的结构化数据测试工具正确评估“ratingValue”、“reviewCount”、“price”和“Product Name”?
- perl - 在 Perl 中创建链表结构
- vba - 循环浏览 VBA 中的文本文件时出现不匹配错误
- java - 调用具有输入参数数组行类型的 db2 过程的任何替代方法?
- sql - 自加入 sql 以获得状态明智的总销售额
- terraform - 从 terraform 中的数组中获取一个值,并将出现作为 terraform 中的计数
- c# - SQL 参数对象类型映射
- node.js - Populating Mongoose objects from id to new field
- java - 为什么在第一个连接结束后创建第二个连接会导致管道异常?
- ms-access - 如何在查询的 Criteria 部分的 IIF 语句中获取多个真实结果