Windows程序设计学习笔记一——第一个windows窗口

本文介绍Windows窗口程序的基础实现流程,涵盖窗口创建、消息处理及显示等核心步骤,并附带示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初次接触Windows程序开发的知识,没有花费太多的精力去理解整个过程的实现原理,先着重于功能的实现,这样对我自己而言,增强了学习的兴趣。整个学习将对《Windows程序设计》第5版中所给的源代码进行理解和重现,并添加一些自己的理解与整理。

在对基本功能实现的熟练掌握的基础上,会进一步加强相关原理内容的学习。

第一篇,对应第三章内容 视窗和讯息

学习目标:1、掌握建立一个Windows窗口的基本实现流程

  2、了解涉及到的相关函数的功能,学会查找对应函数的说明(Windows API等)

  3、可以相对独立的完成代码的编写,并记忆整个流程

学习总结:

一、建立一个Windows窗口的基本实现流程

1、理解入口函数的各个参数意义int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int iCmdShow){}

hinstance:应用程序当前事例的句柄。

hPrelnstance:应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL。

lpCmdLine:指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine。

iCmdShow:指明窗口如何显示。

2、初始化窗口类别属性

实例化WNDCLASS的对象,并将WNDCLASS数据结构中的各个元素分别初始化,每一个都必须要初始化,共有10个。

(当某一个没有被初始化,运行结果可以编译成功,但是不会出现窗口界面,笔者曾经初始化了两次wndclass.lpszMenuName,但是没有初始化
wndclass.lpszClassName,结果不显示窗口,找了好久才发现这个问题,改过来就可以运行了)

3、注释视窗类别RegisterClass(&wnd);

呼叫 RegisterClass 来注册这个视窗类别。该函式只有一个参数,即指向 WNDCLASS 结构的指

4、建立视窗CreateWindow()

函数原型为HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,

DWORD dwStyle,

int x,int y,int nWidth,int nHeight,

HWND hWndParent,HMENU hMenu,HANDLE hlnstance,LPVOID lpParam);

具体参数请自己查找

5、显示视窗、更新视窗

ShowWindow(hwnd,iCmdShow);

UpdateWindow(hwnd);

6、讯息回圈

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

通过以上代码,GetMessage()获得消息信号,TranslateMessage()将消息信号 进行一些转换,DispatchMessage()将信息传给Windows,然後,Windows 

将该讯息发送给适当的视窗讯息处理程式,让它进行处理。

7、窗口建立完成,返回msg.wParam参数。

二、视窗消息处理函数

1、视窗处理函数原型

LRESULT CALLBACK WinProc(HWND,UINT,WPARAM,LPARAM);

2、声明数据结构数据需要的结构数据和变量

本次 实现在视窗内显示一行文字,需要以下数据结构

HDC         hdc ; //装置内容的数据结构
      PAINTSTRUCT ps ;
//

RECT rect; //矩形数据结构,存储文本框大小

3、对应消息下的消息处理操作

switch(message){

case WM_CREATE

case WM_PAINT:

{

1、呼叫BeginPaint()获得装置内容的代号

2、呼叫GetClientRectangle()获得设置区域的尺寸大小

3、DrawText()显示要输出的内容和格式

4、呼叫EndPaint()结束,与BeginPaint()必须成对出现

}

case WM_DESTROY

}

随着学习内容的深入,处理函数会越来越复杂,是学习的终点和难点,还会有其他信息加入

4、缺省的信息处理

函数原型DefWindowProc(HWND,UINT,WPARAM,LPARAM);确保任何信息都可以被处理,并返回一个值

三、完整代码

/*------------------------------------------------------------
   hellowin.cpp文件
  ------------------------------------------------------------*/

#include <windows.h>
#include "mmsystem.h" //导入声音头文件
#pragma comment(lib,"winmm.lib") //导入声音头文件库
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("Hello") ;
     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 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) ;   //播放"hellowin.asv"声音文件
          return 0 ;    
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
          
          GetClientRect (hwnd, &rect) ;
          
          DrawText (hdc, TEXT ("Hello, Windows!"), -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) ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值