鱼C论坛

 找回密码
 立即注册
查看: 27836|回复: 43

[知识点备忘] 第003讲:窗口!窗口!

[复制链接]
发表于 2014-5-18 20:13:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
知识点回顾:


1. Windows 编程,处处都是窗口编程。

消息框是一个窗口,VS2013也是一个窗口,浏览器也是一个窗口,甚至我们的桌面也是一个窗口程序,还有一些看起来不明显的,例如各种按钮、单选按钮、复选按钮、列表框、滚动条这些其实也都是窗口。


2. 我们很长一段时间是在以下这段代码的基础上进行编程,因此请确保至少自己动手敲 5 次以上:

  1. /* -------------------------------------------------------------------
  2.                     MyWindows.c -- 基本窗口模型  
  3.                                 《Windows 程序设计(SDK)》视频教程                    
  4. --------------------------------------------------------------------*/

  5. #include <windows.h>

  6. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  7. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  8. {
  9.         static TCHAR szAppName[] = TEXT("MyWindows");
  10.         HWND hwnd;
  11.         MSG msg;
  12.         WNDCLASS wndclass;

  13.         wndclass.style = CS_HREDRAW | CS_VREDRAW;
  14.         wndclass.lpfnWndProc = WndProc;
  15.         wndclass.cbClsExtra = 0;
  16.         wndclass.cbWndExtra = 0;
  17.         wndclass.hInstance = hInstance;
  18.         wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  19.         wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  20.         wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  21.         wndclass.lpszMenuName = NULL;
  22.         wndclass.lpszClassName = szAppName;

  23.         if (!RegisterClass(&wndclass))
  24.         {
  25.                 MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
  26.                 return 0;
  27.         }

  28.         hwnd = CreateWindow(szAppName,
  29.                 TEXT("鱼C工作室"),
  30.                 WS_OVERLAPPEDWINDOW,
  31.                 CW_USEDEFAULT,
  32.                 CW_USEDEFAULT,
  33.                 CW_USEDEFAULT,
  34.                 CW_USEDEFAULT,
  35.                 NULL,
  36.                 NULL,
  37.                 hInstance,
  38.                 NULL);
  39.         
  40.         ShowWindow(hwnd, iCmdShow);
  41.         UpdateWindow(hwnd);

  42.         while (GetMessage(&msg, NULL, 0, 0))
  43.         {
  44.                 TranslateMessage(&msg);
  45.                 DispatchMessage(&msg);
  46.         }

  47.         return msg.wParam;
  48. }

  49. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  50. {
  51.         HDC hdc;
  52.         PAINTSTRUCT ps;
  53.         RECT rect;

  54.         switch (message)
  55.         {
  56.         case WM_PAINT:
  57.                 hdc = BeginPaint(hwnd, &ps);
  58.                 GetClientRect(hwnd, &rect);
  59.                 DrawText(hdc, TEXT("大家好,这是我的第一个窗口程序!"), -1, &rect,
  60.                         DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  61.                 EndPaint(hwnd, &ps);
  62.                 return 0;

  63.         case WM_DESTROY:
  64.                 PostQuitMessage(0);
  65.                 return 0;
  66.         }

  67.         return DefWindowProc(hwnd, message, wParam, lParam);
  68. }
复制代码


3. Windows 窗口的诞生过程。

定义窗口类结构(WNDCLASS) -> 注册窗口类(RegisterClass) -> 创建窗口(CreateWindow) -> 显示窗口(ShowWindow) -> 更新窗口(UpdateWindow) -> 消息循环(GetMessage -> TranslateMessage ->DispatchMessage



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-19 12:16:40 | 显示全部楼层
怒顶,@牡丹花下的女鬼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2014-5-21 18:25:49 | 显示全部楼层
是不是还有一个“催毁窗口”的函数操作?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2014-6-2 17:14:02 | 显示全部楼层
好好学习,呵呵!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 1

使用道具 举报

发表于 2014-6-8 18:24:33 | 显示全部楼层
小甲鱼老师,代码的第17行应该是  wndclass.style = CS_HREDRAW | CS_VREDRAW; 吧。不然的话当改变窗口宽度的时候,窗口不会重绘啊

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
小甲鱼 + 5 + 5 + 3 谢谢,代码从视频演示版里拷贝出来,忘记改.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-8-8 17:37:44 | 显示全部楼层

:titter:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-20 23:07:03 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-1 16:00:44 | 显示全部楼层
学习了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-6 22:13:31 | 显示全部楼层
求问小甲鱼  这段代码是不是只要会用就行了,不需要理解,只要调用API就行了???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-3 11:23:05 | 显示全部楼层
好好学习 天天向上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-3 15:25:59 | 显示全部楼层
好好学习下:victory:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-19 22:56:52 | 显示全部楼层
为什么我编译不过示例代码
C:\Users\亚龙\Desktop\新建文件夹\collect2.exe        [Error] ld returned 1 exit status
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-20 13:36:34 | 显示全部楼层
真的很不错,就是我用vs2015的时候代码明明一样,还是有问题,不知道怎么回事 哎
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-9 17:10:48 | 显示全部楼层
有一种创建窗口的函数
:
HWND hwand =::CreatWindowEx('''''''')
这个和CreatWindow有何区别呢
感觉参数有些出入啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-9 17:21:54 | 显示全部楼层
我发现一个问题:如果你的项目文件拓展名写的是.cpp
而不是.c
也能运行,这是为什么?
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-15 18:47:52 | 显示全部楼层
东吴 发表于 2016-10-9 17:21
我发现一个问题:如果你的项目文件拓展名写的是.cpp
而不是.c
也能运行,这是为什么?

cpp是c++的后缀,而C++是兼容C的,所以是可以运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-22 13:17:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-6 13:53:56 | 显示全部楼层
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                                   PSTR szCmdLine,int iCmdShow),最后这个参数不对吧,int后应该是要对应ncmdshow的那些值里的某个吧,而且你上面这个参数定义的也是不对,不是i是n吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-25 19:31:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-12 21:59:18 | 显示全部楼层
写的太赞了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 14:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表