用windows API 编写一个C++窗口

#include<windows.h>LRESULTCALLBACKWindowSunProc(HWNDhwnd,//handletowindowUINTuMsg,//m... #include <windows.h>

LRESULT CALLBACK WindowSunProc( HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndCls;
wndCls.cbClsExtra = 0;
wndCls.cbWndExtra = 0;
wndCls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndCls.hCursor = LoadCursor(NULL,IDC_CROSS);
wndCls.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndCls.hInstance = hInstance;
wndCls.lpfnWndProc = WindowSunProc;
wndCls.lpszClassName = NULL;
wndCls.lpszMenuName = NULL;
wndCls.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndCls);

HWND hwnd;
hwnd = CreateWindow("123","456",WS_OVERLAPPEDWINDOW,100,100,500,600,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}
LRESULT CALLBACK WindowSunProc( HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
){
/*响应各种消息*/
return 0;
}
编译连接能通过 为啥执行程序 啥都不给我显示? 不是应该出一个窗口么?

我是以前干JAVA的 初学这玩意儿 勉强能看懂代码的意思 但是不知道怎么解决这个问题 求指导
如果单纯只要出个窗口 或者在窗口里面画点乱七八糟的东西,不涉及事件驱动的情况下,应该不需要创建MSG引用吧?直接在WinMain里面放几个画东西的方法就好了吧?
展开
 我来答
空雪梦见
2013-09-18 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1181万
展开全部
1、wndCls.lpszClassName = NULL; <- 首先,这个,你不给类的名字,这个类肯定是注册失败了
2、hwnd = CreateWindow("123","456",WS_OVERLAPPEDWINDOW,100,100,500,600,NULL,NULL,hInstance,NULL);
<- 因为不存在类 123,所以这里创建不出窗口
3、while(GetMessage(&msg,NULL,0,0)){ <- 因为没有任何窗口,所以这个线程接收不到任何消息,程序就永远卡死在这里
4、/*响应各种消息*/
return 0; <- 没有任何消息响应,甚至连窗口关闭以后也不会PostQuitMessage,所以前面那个GetMessage是不会返回0的,就算关闭了窗口程序也不会退出
更多追问追答
追问
非常感谢您的回答,很到位,很对口,一看就是用心了的姐姐···
我说为啥新建个wndCls对象居然和新建的窗口半毛钱关系都没有 原来是在这个className上关联上了
还有两个问题请教
1.原始问题里面说的
如果单纯只要出个窗口 或者在窗口里面画点乱七八糟的东西,不涉及事件驱动的情况下,应该不需要创建MSG引用吧?造好窗口后,直接在WinMain里面放几个画东西的方法就好了吧?(字数 评论)
追答

1、话说什么叫MSG引用……我没懂

2、在WinMain里放几个画东西的方法是不够的,因为画上去以后,别的窗口来挡一下,然后再把别的窗口拉走;或者最小化再恢复,画的东西就没掉了,甚至可能系统自己刷新了一下你的窗口,画的东西就没掉了:因为系统不会保存窗口上画的东西,每次刷新都要你重新画的。

3、不会帮你初始化

4、注释你一时这么说我也不知道该注哪里……

5、不是姐姐……

6、补充一下,下面那个你说链接没通过的,就是我说程序永远卡在那边不会退出的。你到任务管理器里面把你运行的那个进程给结束了,不然重启之前链接都不会通过

郝在益
2013-09-18 · TA获得超过2079个赞
知道小有建树答主
回答量:1496
采纳率:54%
帮助的人:624万
展开全部
这个,你还要响应各种必要的消息。如:WM_PAINT,WM_CLOSE,WM_DESTORY等消息
其次,在WM_PAINT函数中,你还必须写上关于dc的那一部分,不然就显示不了的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
睇一睇罗
2013-09-18
知道答主
回答量:38
采纳率:0%
帮助的人:8.2万
展开全部
给你一段完整的code:

#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 ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow( szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return static_cast<int> (msg.wParam) ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;

switch (message)
{
case WM_CREATE:
//PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0);
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

GetClientRect (hwnd, &rect) ;

DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
追问
编译过了 链接没过 
Linking...
LINK : fatal error LNK1168: cannot open Debug/Win32Application.exe for writing
Error executing link.exe.
Win32Application.exe - 1 error(s), 0 warning(s)
追答
要在工程中添加相关lib文件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式