C语言初学者:使用CreateWindow创建一个窗口

以下内容转自http://blog.csdn.net/aasmfox/article/details/8451950,多谢博主aasmfox


看着MFC向导生成的程序,总归是一头的雾水,看不清,搞不懂.

还是老老实实的学下C语言吧.

但是只学C语言的的内容是很单调的,于是要结合window的基础编程一起学习.

这样才能学以致用.

 

以前看书都是坚持不到最后,最多看到一半就没有耐心了.学到的知识也不能完整的消息吸收.

现在回过头来,还是认清自己的真实基础,那是真心只能一点皮毛,还是要脚踏实地的好好学习.

 

学习window的基础,还是先学一个CreateWindow函数吧.这个函数是基础中的基础.

 

现在重新用C语言进行学习.整理一下,记录在这里.总是一个学习日记吧.

 

1.关于消息映射

用C语言进行编程时,要对很多的window消息进行处理.这是必须的.

没有办法.

书上的写法都是使用 switch case来进行判断处理.这个很麻烦.总觉得这样写出来的东西,不方便,也不顺手.

虽然有一个windowx.h中的HANDLE_MSG宏,可以方便一点使用.这也有一个麻烦的事情要处理.

就是要记住函数的定义格式.对于学习来说,这样又点不顺心了.

我的想法是,在学习的时候,不需要什么代码的优秀和高质量.

关键在于,学习的时候,对照书本的知识点,可以迅速的进行代码验证,并行到运行结果.

所以.写代码的时候,要有针对性,只要快点,方便点就发了.

 

以前学C语言的时候,不会用.这次看书后,照着MFC中的消息处理样子,自己弄了一个宏来处理.

代码如下:

  1. BEGIN_MESSAGE_MAP(WIN)  
  2.     ON_MESSAGE(WIN,WM_CREATE,OnCreate)  
  3.     ON_MESSAGE(WIN,WM_CLOSE,OnClose)  
  4.     ON_MESSAGE(WIN,WM_LBUTTONDOWN,OnLButtonDown)  
  5.     ON_MESSAGE(WIN,WM_PAINT,OnPaint)  
  6. END_MESSAGE_MAP()  


用于处理一些常用的消息函数,对应的 OnPaint,OnClose,OnCreate函数,则统一定义成以下格式

  1. LRESULT Fnnction(HWND hwnd)  

这样就不用去记忆那些wpapa和lparam的意义了.

直接把这两个值保存到window的prop属性中,如果函数需要使用的话,可以重新读取,这个一头一尾宏定义,可以方便我自己写代码的更方便一点.

  1. #define     DECLARE_MESSAGE_MAP(T) LRESULT CALLBACK T##_WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp);  
  2.   
  3. #define     BEGIN_MESSAGE_MAP(T)  LRESULT CALLBACK T##_WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp){ \  
  4.     SetProp(hwnd,L"WP",(HANDLE)wp);SetProp(hwnd,L"LP",(HANDLE)lp); \  
  5.     if(!msg)  \  
  6. return 0 ;   

 

再定义一个ON_MESSAGE宏,可以处理各个消息了.

  1. #define ON_MESSAGE(ID,message,fn)  else if(msg==message) return ID##_##fn(hwnd);  


为了取出保存后的wparam和lparam参数,于是,又要写2个宏.

  1. #define Getlparam(H)   (LPARAM)GetProp(##H,L"LP")  
  2. #define Getwparam(H)   (WPARAM)GetProp(##H,L"WP")  


2.SetwindowText函数的处理

 C语言中处理字符串不太方便,SetWindowText只能设置字符串,了为方便点设置窗口文件,重新写一个函数,类似于Printf,什么格式,自己定义就好了,不用转换了.

  1. int SetWindowString(HWND hwnd,LPCWSTR pszFormat,...)  
  2. {  
  3.     va_list args;  
  4.     va_start(args, pszFormat);    
  5.     LPWSTR pstrText=FormatString(pszFormat,args);    
  6.     va_end(args);    
  7.     ::SetWindowText(hwnd,pstrText);  
  8.     delete  pstrText;   
  9.     return 0;  
  10. }  


有这2个东东,学C语言省了一点力气.


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很抱歉,作为一个AI语言模型,我并不能实际编写代码,但是,我可以为你提供一个基本的窗口程序的框架,供您参考: ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //注册窗口类 WNDCLASS wc = {0}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = L"MyWindowClass"; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.hCursor = LoadCursor(NULL, IDC_ARROW); RegisterClass(&wc); //创建窗口 HWND hwnd = CreateWindow( L"MyWindowClass", L"My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); //消息循环 MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 5, 5, L"Hello, World!", 13); EndPaint(hwnd, &ps); break; } case WM_CLOSE: { DestroyWindow(hwnd); break; } case WM_DESTROY: { PostQuitMessage(0); break; } default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } ``` 这个程序定义了一个名为“My Window”的窗口,并在该窗口中显示“Hello, World!”的消息。你可以根据你的需求修改和扩展这个程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值