C语言实现Win32第一个窗口

Windows顾名思义就是窗口,将窗口程序加入到操作系统中具有里程碑式的意义。掌握窗口程序的实现是学习Win32程序实现的重要环节。

一个Win32窗口程序的实现通常要经历下面3个步骤:

1、注册窗口(窗口的风格、图标、光标、大小等)

2、创建、显示窗口

3、消息循环。

同时需要一个入口函数WinMain和一个消息响应函数

WinMain()函数是应用程序开始执行时的入口点,通常也是应用程序结束任务退出时的出口点。它与DOS程序的main()函数起同样的作用,不同的是,WinMain()函数必须带有四个参数,将在函数调用时传递给操作系统。

消息响应函数也可以叫做消息处理函数、窗口过程函数,它的作用就是处理该窗口的各种消息,比如鼠标的点击、键盘的输入、最大化、最小化、关闭等操作。与我们调用的函数不同,消息响应函数属于回调函数(由我们按系统的要求编写,然后被系统调用的函数),系统将在该窗口收到某条消息的时候使用我们提供的消息响应函数进行响应。

大体代码如下:

 1 #include <windows.h>
 2 #include <tchar.h>
 3
 4 LRESULT _stdcall WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
 5
 6 int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
 7 {
 8  HWND hwnd;
 9  WNDCLASS wndcls;
10  MSG msg;
11  /*↓↓↓↓↓↓↓↓↓↓↓↓注册窗口↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
12  wndcls.cbClsExtra=0;
13  wndcls.cbWndExtra=0;
14  wndcls.hbrBackground=(HBRUSH)COLOR_WINDOW;
15  wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);
16  wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);
17  wndcls.hInstance=hInstance;
18  wndcls.lpfnWndProc=WndProc;
19  wndcls.lpszClassName=_T("ClassName");
20  wndcls.lpszMenuName=_T("MenuName");
21  wndcls.style=CS_HREDRAW | CS_VREDRAW;
22  RegisterClass(&wndcls);
23  /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
24
25  /*↓↓↓↓↓↓↓↓↓↓↓创建、显示窗口↓↓↓↓↓↓↓↓↓↓↓↓*/
26  hwnd=CreateWindow(_T("ClassName"),_T("WindowsName"),WS_OVERLAPPEDWINDOW,
27   0,0,600,400,NULL,NULL,hInstance,NULL);
28  ShowWindow(hwnd,SW_SHOWNORMAL);
29  UpdateWindow(hwnd);
30  /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
31
32  /*↓↓↓↓↓↓↓↓↓↓↓消息循环↓↓↓↓↓↓↓↓↓↓↓↓*/
33  while(GetMessage(&msg,NULL,0,0))
34  {
35   TranslateMessage(&msg);
36   DispatchMessage(&msg);
37  }
38  /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
39
40  return 0;
41 }
42
43 /*↓↓↓↓↓↓↓↓↓↓↓窗口过程函数↓↓↓↓↓↓↓↓↓↓↓↓*/
44 LRESULT _stdcall WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
45 {
46  switch(uMsg)
47  {
48  case WM_COMMAND:
49   return DefWindowProc(hwnd, uMsg, wParam, lParam);
50   break;
51  case WM_DESTROY:
52   PostQuitMessage(0);
53   break;
54  default:
55   return DefWindowProc(hwnd, uMsg, wParam, lParam);
56  }
57  return 0;
58 }

我们也可以将注册窗口、创建显示窗口封装成函数,已让结构更加的清晰。

 1 #include <windows.h>
 2 #include <tchar.h>
 3
 4 LRESULT _stdcall WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
 5 ATOM RegistreClass(HINSTANCE hInstance);
 6 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
 7
 8 int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
 9 {
10  MSG msg;
11  RegistreClass(hInstance);//
12  InitInstance(hInstance, nCmdShow);//
13  while(GetMessage(&msg,NULL,0,0))
14  {
15   TranslateMessage(&msg);
16   DispatchMessage(&msg);
17  }
18  return 0;
19 }
20
21 ATOM RegistreClass(HINSTANCE hInstance)
22 {
23  WNDCLASS wndcls;
24  wndcls.cbClsExtra=0;
25  wndcls.cbWndExtra=0;
26  wndcls.hbrBackground=(HBRUSH)COLOR_WINDOW;
27  wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);
28  wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);
29  wndcls.hInstance=hInstance;
30  wndcls.lpfnWndProc=WndProc;
31  wndcls.lpszClassName=_T("ClassName");
32  wndcls.lpszMenuName=_T("MenuName");
33  wndcls.style=CS_HREDRAW | CS_VREDRAW;
34
35  return RegisterClass(&wndcls);
36 }
37
38 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
39 {
40  HWND hWnd;
41  hWnd=CreateWindow(_T("ClassName"),_T("WindowsName"),WS_OVERLAPPEDWINDOW,
42   0,0,600,400,NULL,NULL,hInstance,NULL);
43  if (!hWnd)
44  {
45   return FALSE;
46  }
47  ShowWindow(hWnd,SW_SHOWNORMAL);
48  UpdateWindow(hWnd);
49  return TRUE;
50 }
51
52 LRESULT _stdcall WndProc(HWND hwnd,UINT uMsg,WPARAM wParam, LPARAM lParam)
53 {
54  switch(uMsg)
55  {
56  case WM_COMMAND:
57   return DefWindowProc(hwnd, uMsg, wParam, lParam);
58   break;
59  case WM_DESTROY:
60   PostQuitMessage(0);
61   break;
62  default:
63   return DefWindowProc(hwnd, uMsg, wParam, lParam);
64  }
65  return 0;
66 }

WinMain和WndProc函数前面的stdcall是一种函数调用约定,不同于C语言默认的cdecl调用。采用stdcall的函数,在结束时,函数自身将清理“栈”,恢复到调用之前的状态。大多数API函数都是使用stdcall的方式。而采用cdecl的函数将由该函数的调用者对“栈”进行清理。

时间: 2024-10-06 00:28:17

C语言实现Win32第一个窗口的相关文章

Win32知识之窗口绘制.窗口第一讲

Win32知识之窗口本质 一丶摘要 在学习Win32的时候. 很多操作都是窗口进行操作的.那么今天就说一下窗口的本质是什么. 窗口的本质是不断绘制.是windows通过消息机制进行绘制的. 我们知道.内存分为高低2G 低2G是给应用程序使用的. 高2G是给操作系统使用的.而我们画图形的操作都是操作系统通过底层的 win32k.sys这个驱动来提供的. 进程跟线程管理是通过notokerner.exe这个程序来管理的.但是三环不能使用.所以提供接口给三环. 分别是kerner32.dll 跟use

delphi程序向另一个可执行程序发消息(使用GetForegroundWindow; 找出当前操作系统中活动的第一个窗口)

function FindWindowThroughWindowText(WindowText: string): THandle;var  hCurrentWindow: THandle;  cnt: Integer;  WindowTitle: array [0 .. 254] of Char;begin  Result := INVALID_HANDLE_VALUE; // 返回值预设为无效的句柄  hCurrentWindow := GetForegroundWindow; // 找出当

C语言基础课程 第一课 Linux环境配置小实战httpserver

?? C语言基础课程 第一课 Linux环境配置小实战httpserver 首先环境需要的是redhat虚拟机操作系统 打开redhat 防火墙 2.将WWW(HTTP)勾选上 3.点击apply 点击是 4.切换到root用户 输入正确的root密码 5. 启动http服务 6.输入ifconfig 查看当前ip 痛 7.通过分析我们知道 他是一个局域网的ip   windows可以通过net 或者 主机模式与Linux进行通信 如果不想改变本地ip地址的话  我们需要改变虚拟机的ip地址 和

【DirectX11-Tutorial】编写第一个窗口程序creating a window

本系列主要参考此博客的文章l,同时会加上一点个人实践过程. ========================================== 分割线 ========================================== 这篇文章主要分为三个部分,首先是看一下创建窗口完整的代码,然后了解程序运作的主要细节,最后如何修改这些代码. 接下来开始第一个窗口程序,上一个程序中使用WinMain()函数开始整个程序,这一次将结合另一个函数WinProc(),这个函数将处理程序每一个系统运

C语言调用WIN32 API教程之1创建窗口

本学习笔记基于VC++6.0开发环境,通过c语言编程语言,调用win32 API进行windows系统应用程序开发. 1,打开VC++6.0,点击 文件->新建->工程->Win32 Application 工程名填写example1,点击确定,选择 一个空工程,点击完成. 2,点击"新建文件" 按钮,新建一个空白文件,点击 文件->另存为 输入文件名example1.c 选择工作空间对应的文件夹,保存. 3,点击FileView,右击Source File,点

【win32汇编】0x04 第一个窗口程序

第一个win32汇编窗口程序,主要来自 win32汇编语言程序设计,然后加上了自己查阅msdn文档的一些理解,基本过程: start入口地址 --> _WinMain主函数 --> 定义一些需要用的消息实体和类实体 --> 注册窗口类 --> 建立并显示窗口 --> 消息循环 ( _ProcMain主要用于处理程序接受的消息 ) 1 ;模式定义 2 ;>>>>>>>>>>>>>>>>

java SE 入门之语言与环境(第一篇)

Javase的语言与开发环境Keke2016年03月08日 Java属于-Oracle公司(甲骨文)创始人:Gosling1995年诞生1998年12月发布jdk1.22002年2月发布:jdk1.42006年12月发布:jdk1.6 2007年sun倒下,google推出android依托java的jvm2009年4月20日被oracle收购.2011年7月28日,oracle发布了jdk1.7,这个版本引入了swtich语法,菱形泛型,多异常捕捉,自动关闭资源等.2014年3月18日,发布j

Axiom3D写游戏:第一个窗口

Axiom主要的代码大致翻看了下,就想到了自己来模拟一下游戏开发. 这章主要包括创建窗口及3D渲染的一些基本元素,并添加一个第三人称的骨骼动画作主角,加上前文中修改过后的地形组件,能用鼠标和键盘进行漫游.如下图所示. 在Axiom上给出的例子中,可以选择是用OpenGL或是DirectX渲染,现在有问题的地方是如果用OpenGL渲染,而Axiom鼠标与键盘输入采用的是SharpInputSystem,这个在DirectX渲染下是没有问题的,但是在OpenGL渲染的窗口下得不到正确的鼠标位置.而D

C语言调用WIN32 API学习之3创建复选框

上一节学习了创建按钮,下面我们来在窗口上创建复选框,并进行点击动作. 1,打开VC++6.0,点击 文件->打开工作空间 选择example1,点击确定,打开工程. 2,添加代码 首先定义全局变量 HWND button1,checkBox1,checkBox2; int checkBoxValve; 更改回调函数如下 LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)//回调函数定义{ swi