windows编程

在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);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值