windows编程

原创 2013年12月04日 16:09:41

在c语言界面这一块狠狠的摔了几次,我打算重新学一遍

首先是winmain()

WinMain是一个函数,该函数的功能是被系统调用,作为一个32位应用程序的入口点。WinMain函数应初始化应用程序,显示主窗口,进入一个消息接收一发送循环,这个循环是应用程序执行的其余部分的顶级控制结构。


函数原型

int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)

如果函数成功,当它接收到一个WM_QUIT消息时就中止,函数应该返回在该消息的wParam参数的退出值。如果函数在进入消息循环前退出,应该返回零。

hInstance:应用程序当前实例的句柄。

hPrevlnstance:应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32位程序,该参数总为NULL。

lpCmdLine:指向应用程序命令行的字符串的指针,不包括执行文件名。

nCmdShow:指明窗口如何显示。该参数可以是下列值之一:
SW_HIDE:隐藏窗口并且激活另外一个窗口。
SW_MINIMIZE:最小化指定的窗口,并且激活在系统表中的顶层窗口。
SW_RESTORE:激活并显示窗口。如果窗口已经最小化或最大化,系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)。
SW_SHOW:激活一个窗口并以原来的尺寸和位置显示窗口。
SW_SHOWMAXIMIZED:激活窗口并且将其最大化。
SW_SHOWMINIMIZED:激活窗口并将其最小化(以图标显示)。
SW_SHOWMINNOACTIVE:将一个窗口显示为图标。激活窗口维持活动状态。
SW_SHOWNA:以窗口的当前状态显示窗口。激活窗口保持活动状态。
SW_SHOWNOACTIVATE:以窗口的最近一次的尺寸和位置显示窗口。激活窗口维持激活状态。
SW_SHOWNORMAL:激活并显示窗口。如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)。



2.注册窗口

WNDCLASS是一个窗口类结构:

typedef struct
{
     UINT        style ;                                   //窗口类别样式
     WNDPROC     lpfnWndProc ;                //设定消息处理程序
     int         cbClsExtra ;                            //用于在窗口类别结构和Windows内部保存的窗口结构中预留一些额外空间
     int         cbWndExtra ;                         //同上
     HINSTANCE   hInstance ;                    //程序的执行实体句柄
     HICON       hIcon ;                              //为所有依据这个窗口类别建立的窗口设置一个图标
     HCURSOR     hCursor ;                       //设置鼠标光标
     HBRUSH      hbrBackground ;             //指定依据这个类别建立的窗口背景颜色
     LPCTSTR     lpszMenuName ;             //指定窗口类别菜单
     LPCTSTR     lpszClassName ;             //必须给出一个类别名称
}
WNDCLASS, * PWNDCLASS ;


3。建立窗口

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


4.显示窗口

ShowWindow (hwnd, iCmdShow);

UpdateWindow (hwnd);


5.消息循环

while (GetMessage (&msg, NULL, 0, 0))
{
     TranslateMessage (&msg) ;      
     DispatchMessage (&msg) ;
}


6.窗口消息处理程序

//窗口消息处理程序总是定义为如下形式
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
     HDC         hdc ; 
     PAINTSTRUCT ps ; 
     RECT        rect ; 
     //在此程序中,WndProc只选择处理三种消息:WM_CREATE、WM_PAINT和WM_DESTROY。窗口消

息处理程序的结构如下:
     switch (message) 
     { 
     case WM_CREATE: 
          //播放声音文件
            PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; 
          return 0 ; 
     case WM_PAINT: 
         //对WM_PAINT的处理几乎总是从一个BeginPaint呼叫开始,而以一个EndPaint呼叫结束

,BeginPaint使显示区域变为有效。如果不呼叫BeginPaint和EndPaint(或者ValidateRect),

则Windows不会使该区域变为有效。相反,Windows将发送另一个WM_PAINT消息,且一直发送下去

。
           hdc = BeginPaint (hwnd, &ps) ;    
         //GetClientRect函数检索一个窗口的客户区坐标rect          
         GetClientRect (hwnd, &rect) ;      
         //DrawText可以输出文字。第一个参数是从BeginPaint传回的设备内容句柄;第二个参

数是要输出的文字;第三个参数是-1,指示字符串是以字节终结的;DrawText最后一个参数是一

系列位旗标,旗标指示了文字必须显示在一行上,水平方向和垂直方向都位于第四个参数指定的

矩形中央。 
          DrawText (hdc, TEXT ("Hello, Windows Vista!"), -1, &rect, 
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; 
         EndPaint (hwnd, &ps) ;                
         return 0 ; 
     case WM_DESTROY: 
         //通过呼叫PostQuitMessage以标准方式响应WM_DESTROY消息
          PostQuitMessage (0) ; 
         return 0 ; 
     } 
     //呼叫DefWindowProc来为窗口消息处理程序不予处理的所有消息提供内定处理,这是很重

要的。不然一般动作,如终止程序,将不会正常执行。
     return DefWindowProc(hwnd, message, wParam, lParam); 
}



msg变量是型态为MSG的结构,型态MSG在WINUSER.H中定义如下:

typedef struct tagMSG
{
     HWND   hwnd ;                //接收消息的窗口句柄
     UINT   message ;             //消息标识符。这是一个数值,用以标识消息。
     WPARAM wParam ;          //一个32位的「message parameter(消息参数)」
     LPARAM lParam ;             //一个32位的消息参数,其值与消息有关
     DWORD  time ;                //消息放入消息队列中的时间
     POINT  pt ;                      //消息放入消息队列时的鼠标坐标
}
MSG, * PMSG ;

POINT数据型态也是一个结构,它在WINDEF.H中定义如下:

typedef struct tagPOINT
{
     LONG  x ;
     LONG  y ;
}
POINT, * PPOINT;

在文章的最后贴上别人的完整代码

#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))
	{
		//在Windows 98中,大多数Unicode函数无法执行,MessageBoxW是个例外
		MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
			szAppName, MB_ICONERROR) ;     
		return 0 ;
	}

	//建立窗口
	hwnd = CreateWindow (szAppName,                  // window class name
		TEXT ("我的窗口"), // 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:
		return 0 ;

	case WM_PAINT:
		hdc = BeginPaint (hwnd, &ps) ; 
		//GetClientRect函数检索一个窗口的客户区坐标rect          
		GetClientRect (hwnd, &rect) ;        
		DrawText (hdc, TEXT ("Hello, huangjin"), -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);
}


相关文章推荐

windows编程经典书籍

本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好. 驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家...

Windows编程入门(9)--MFC中的ComboBox的使用

转自:http://blog.csdn.net/yunqi415/article/details/6963720 MFC ComboBox   一、入门篇   ComboBox (组合框)控...

Windows编程实验4

1.如果写一个普通函数,采用直接创立窗口对象的方式创建一个窗体,会有什么问题? #include #include "mywidget.h" #include //包含头文件 void f(...

Windows编程之滚动条

Windows编程之滚动条 http://see.xidian.edu.cn/cpp/html/1110.html   滚动条是图形使用者接口中最好的功能之一,它很容易使用,而且提供了很好的视觉...

走进windows编程的世界-----绘图相关

Windows绘图  1 图形绘制      1.1 图形绘制的方式      获取到绘图句柄-设备描述表(DC),使用相应的绘图的API,在设备上绘制图形.          1.2 颜色     ...

windows编程中L,_T() ,TEXT和_TEXT的使用及其区别

一、 L使用说明TCHAR *szError = L"Error";字符串(literal string)前面的大写字母L,用来告诉编译器该字符串应该作为Unicode来编译。它用来将ASNI转换为U...

用Eclipse + CDT + MinGW做Windows编程第四部分:将可重用的部分做成静态库

4.1 导入示例项目   下载本文中用到的两个C++项目(Eclipse+CDT项目,环境按第一部分的说明配置),下载后解压。   然后在Eclipse中使用File->Import->Genar...

Windows编程入门程序详解

Windows编程入门程序详解 1.     程序 /***************************************************************...
  • jinvmen
  • jinvmen
  • 2015年11月27日 10:19
  • 370

【Windows编程】如何判断操作系统是64位还是32位

我为我基础知识掌握的薄弱,感到深深的“折服”。感觉从知识体系的掌握上就有问题!!需要探索性的改进自身的知识架构。加油吧……   一,不同位数操作系统下类型简介   类型 32...

走进windows编程的世界-----消息处理函数(1)

Win32消息机制    过程驱动:程序是按照我们预先定义好的顺序执行,每执行一步,下一步都已经按照预定的顺序 继续执行,直至程序结束。    事件驱动:程序的执行顺序是无序的。某个时间点所执行的代码...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows编程
举报原因:
原因补充:

(最多只允许输入30个字)