用windows API 编写一个C++窗口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用windows API 编写一个C++窗口相关的知识,希望对你有一定的参考价值。
#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里面放几个画东西的方法就好了吧?
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、补充一下,下面那个你说链接没通过的,就是我说程序永远卡在那边不会退出的。你到任务管理器里面把你运行的那个进程给结束了,不然重启之前链接都不会通过
Linking
LINK fatal error LNK1168: cannot open Debug/Win32Application.exe for writing
Error executing link.exe.
Win32Application.exe - 1 error(s), 0 warning(s)
代码我会好好研究 我也相信没有错 但是链接就是不过 = =!
其次,在WM_PAINT函数中,你还必须写上关于dc的那一部分,不然就显示不了的。 参考技术B 给你一段完整的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文件
以上是关于用windows API 编写一个C++窗口的主要内容,如果未能解决你的问题,请参考以下文章
视频下集:1小时学会!用C++模板快速编写Windows窗口图形界面程序,不用MFC