当前位置:文档之家› windows函数+winmain函数说明

windows函数+winmain函数说明

//函数:WinMain( )
//功能:Windows程序入口函数。创建主窗口,处理消息循环
hlnstance 当前实例句柄 初始化程序主窗口的过程中就需要使用它作为参数。
hPrevInstance 前一个实例的句柄 一般用NULL。
lpCmdLine 指向应用程序命令行参数字符串的指针。
nCmdShow 用来指定窗口显示方式的整数。
//*******************************************************************
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nCmdShow)
{
MSG msg;
if ( !InitWindow( hInstance, nCmdShow ) ) return FALSE; //创建主窗口
//进入消息循环:
while(1)
{
if(PeekMessage(&msg, NULL,0, 0, PM_REMOVE))
{
if ( msg.message==WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
//******************************************************************
1)MessageBox(NULL,TEXT("丐界你好"),TEXT("问好"),MB_OK);
第一个参数暂时丌讲;第二个是正文;第三个是标题(Caption) ;第四个是类型。
MB_OK 就是表示有一个 OK 按钮【确定】 )
//******************************************************************
//******************************************************************
//函数:InitWindow( )
//功能:创建窗口。
//******************************************************************
static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
//定义窗口风格:
WNDCLASS wc;
wc.style = NULL;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "My_Test";
RegisterClass(&wc);//注册窗口
//按所给参数创造窗口
hwnd = CreateWindow("My_Test",
"My first program",
WS_POPUP|WS_MAXIMIZE,0,0,
GetSystemMetrics( SM_CXSCREEN ), //此函数返回屏幕宽度
GetSystemMetrics( SM_CYSCREEN ), //此函数返回屏幕高度
NULL,NULL,hInstance,NULL);
if( !hwnd ) return FALSE;
ShowWindow(hwnd,nCmdShow);//显示窗口
UpdateWindow(hwnd);//刷新窗口
return TRUE;
}
//******************************************************************
//函数:WinProc( )
//功能:处理主窗口消息
//******************************************************************
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam )
{
switch( message )
{
case WM_KEYDOWN://击键消息
switch( wParam )
{
case VK_ESCAPE:
MessageBox(hWnd,"ESC键按下了! 确定后退出!","Keyboard",MB_OK);
PostQuitMessage( 0 );//退出
break;
}
break;
case WM_RBUTTONDOWN:
MessageBox(hWnd,"鼠标右键按下了!","Mouse",MB_OK);
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
}
return DefWindowProc(hWnd, message, wParam, lParam); //调用缺

省消息处理过程
}
*************************************************************************8
GetSystemMetrics() 取使用者接口上各类视觉组件大小的信息
是一个能用来获得Windows中不同对象的尺寸信息的函数 GetSystemMetrics( SM_CXSCREEN )返回屏幕宽度
GetTextMetrics取得字体大小。
在需要确定文字大小时,先取得设备内容句柄,再呼叫GetTextMetrics:
TEXTMETRIC tm ;
HDC hdc ;
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
ReleaseDC (hwnd, hdc)
*************************************************************************
GetMessage ();
PeekMessage (&msg, NULL, 0, 0, PM_REMOVE) ;获得消息
不能用PeekMessage从消息队列中删除WM_PAINT消息,实际上GetMessage并
不从消息队列中删除WM_PAINT消息。从队列中删除WM_PAINT消息的唯一方法是令窗口显示区域
的失效区域变得有效,这可以用ValidateRect和ValidateRgn或者BeginPaint和EndPaint对来完成。如
果在使用PeekMessage从队列中取出WM_PAINT消息后,同平常一样处理它,那么就不会有问题了。
所不能作的是使用如下所示的程序代码来清除消息队列中的所有消息:
while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) ;
*************************************************************************
呼叫来保存设备内容的状态:
idSaved = SaveDC (hdc) ;
想要回到呼叫SaveDC前存在的设备内容时,呼叫:
RestoreDC (hdc, idSaved) ;
,您可以更改某些属性并再次呼叫SaveDC。要将设备内容恢复到一个已经保存的状态,呼叫:
RestoreDC (hdc, -1) ;
这就将设备内容恢复到最近由SaveDC函数保存的状态中。**********************************************************************
DispatchMessage(&msg);将消息发送给窗口消息处理程序
*************************************************************************
LoadIcon 加载图标供程序使用 例:wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
**************************************************************************
LoadCursor 加载鼠标光标供程序使用 例:wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
*************************************************************************
GetStockObject 取得一个图形对象(在这个例子中,是取得绘制窗口背景的画刷对象)
例:wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
**************************************************************************
RegisterClass 为程序窗口注册窗口类别 例:RegisterClass (&wndclass) &wndclass:窗口结构体
***************************************************************************
CreateWindow 根据窗口类别建立一个窗口
例:hwnd = CreateWindow (szAppName, //窗口名

TEXT ( "The Hello Program"), // 窗口标题

WS_OVERLAPPEDWINDOW | , // 窗口类别
WS_VSCR

OLL | WS_HSCROLL(加上垂直|水平滚动条)
WS_POUP|WS_VISIBLE(全屏)

CW_USEDEFAULT, // 相对屏幕左上角X坐标(像素)

CW_USEDEFAULT, // 相对屏幕左上角Y坐标(像素)

CW_USEDEFAULT, // 宽度(像素)

CW_USEDEFAULT, // 高度(像素)

NULL, // 父窗口句柄

NULL, // 窗口菜单句柄

hInstance, // 。窗口句柄

NULL) ; // 附加参数
****************************************************************************
BOOL ShowWindow( HWND hWnd, int nCmdShow );
参数hWnd就是要显示的窗口的句柄。
nCmdShow是窗口的显示方式,一般给它WinMain( )函数得到的nCmdShow的值就
可以了。常用的窗口显示方式有:
方式 含义
SW_HIDE 隐藏窗口
SW_MINIMIZE 最小化窗口
SW_RESTORE 恢复并激活窗口
SW_SHOW 显示并激活窗口
SW_SHOWMAXIMIZED 最大化并激活窗口
SW_SHOWMINIMIZED 最小化并激活窗口
ShowWindow( )函数的执行优先级不高,当系统正忙着执行其它的任务时窗口不会立即
显示出来。所以我们使用ShowWindow( )函数后还要再调用UpdateWindow(HWND
hWnd);函数以保证立即显示窗口。SHOWNORMAL 一般大小显示 SW_SHOWMAXIMIZED 是最大化显示的 SW_SHOWMINNOACTIVE 只显示在工作列上
****************************************************************************
UpdateWindow 指示窗口自我更新 UpdateWindow (hwnd) ;hwnd:窗口句柄
***************************************************************************
GetMessage 从消息队列中取得消息 例:GetMessage (&msg, NULL, 0, 0) &msg:指向名为msg的MSG结构
NULL,0,0:表示程序接收它自己建立的所有窗口的所有消息
****************************************************************************** 
GetUpdateRect 可以在任何时候取得无效矩形的坐标。
*******************************************************************************
TranslateMessage 转译某些键盘消息 TranslateMessage (&msg) ;&msg:指向名为msg的MSG结构
******************************************************
DispatchMessage 将消息发送给窗口消息处理程序 DispatchMessage (&msg) ;&msg:指向名为msg的MSG结构
*******************************************************
PlaySound 播放一个声音文件 例:见《音乐播放函数》
*********************************************************
BeginPaint 开始绘制窗口 hdc = BeginPaint (hwnd, &ps) ;hwnd:窗口句柄 &ps:指向PAINTSTRUCT结构的指针
*******************************************************
GetClientRect 取得窗口显示区域的大小 例GetClientRect (hwnd, &rect) ;hwnd:窗口句柄 &rect:

包含显示区域起点坐标和宽、高(像素)的结构
********************************************************
DrawText 显示字符串 DrawText ( hdc, TEXT ("任意内容"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
hdc:从BeginPaint传回的设备内容句柄 TEXT ("任意内容"):是要输出的文字 -1:指示字符串是以字节0终结的。
&rect:包含显示区域起点坐标和宽、高(像素)的结构
********************************************************
EndPaint 结束绘制窗口 EndPaint (hwnd, &ps) ;hwnd:窗口句柄 &ps:指向PAINTSTRUCT结构的指针
********************************************************
PostQuitMessage 在消息队列中插入一个「退出程序」消息 例:PostQuitMessage (0) ;
*********************************************************
SendMessage 直接呼叫它自己的窗口消息处理程序
**********************************************************
ValidateRect 使显示区域内的任意矩形区域变为有效。
*********************************************************
linethick7; 改变字体大小
SetTextColor(hdc,RGB(111,111,111));改变TextOut函数输出文字的颜色
红,绿,蓝
SetTextColor(hdc,RGB(111,111,111));设置文本背景色
SetBkMode(hScreenDC,TRANSPARENT);透明背景
SetBkMode(hdc,TRANSPARENT); 让TextOut函数不能改变背景
TextOut (hdc, x, y, psText, iLength) ; 向窗口的显示区域写入字符串
hdc参数是「设备内容句柄」,它是GDI的重要部分。实际上,每个GDI函数都需要将这个句柄作为函数的第一个参数。
psText参数是指向字符串的指针
iLength是字符串的长度
x和y参数定义了字符串在显示区域的开始位置(不久会讲述关于它们的详细情况)
或用Windows表头文件中的标识符,即SYSTEM_FONT。
********************************************************
DrawText 显示字符串 DrawText ( hdc, TEXT ("任意内容"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
hdc:从BeginPaint传回的设备内容句柄 TEXT ("任意内容"):是要输出的文字 -1:指示字符串是以字节0终结的。
&rect:包含显示区域起点坐标和宽、高(像素)的结构
DT_CALCRET 计算显示文本显示尺寸
DT_WORDBREAK 可以换行
DT_CENTER 指定文本水平居中显示
DT_VCENTER 指定文本垂直居中显示
DT_SINGLELINE 单行显示
*******************************************************************
PAINTSTRUCT ps ;
HDC hdc ;
hdc = BeginPaint (hwnd, &ps) ;
使用GDI函数
EndPaint (hwnd, &ps) ;
return 0 ;
获取句柄
hdc = GetDC (hwnd) ;
ReleaseDC (hwnd, hdc) ;

GetWindowDC。GetDC传回用于写入窗口显示区域的设备内容句柄,而GetWindowDC传回写入整个窗口的设备内容句柄。例如,您的程序可以使用从GetWindowDC传回的设备内容句柄

在窗口的标题列上写入文字。然而,程序同样也应该处理WM_NCPAINT (「非显示区域绘制」)消息。

可以通过下面的调用来取得整个屏幕的设备内容句柄:
hdc = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL);
***************************************************************
InvalidateRect (hwnd, NULL, TRUE) ;

该呼叫在BeginPaint呼叫之前进行,它使整个显示区域变为无效,并擦除背景。但是,如果最后一个参数等于FALSE,则不擦除背景,原有的东西将保留在原处。
************************************************************
修改显示区域
static int cxClient, cyClient ;
caseWM_SIZE:

cxClient = LOWORD (lParam) ;

cyClient = HIWORD (lParam) ;

return 0 ;
计算可以在显示区域内显示的文字的总行数:

cyClient / cyChar
显示区域的水平方向可以显示的小写字符的近似数目为:

cxClient / cxChar
************************************************************
将范围改变为更方便于程序的数值
SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw) ;

参数iBar为SB_VERT或者SB_HORZ,iMin和iMax分别是范围的最小值和最大值。如果想要Windows根据新范围重画滚动条,则设置bRedraw为TRUE(如果在呼叫SetScrollRange后,呼叫了影响滚动条位置的其它函数,则应该将bRedraw设定为FALSE以避免过多的重画)。
SetScrollPos在滚动条范围内设置新的卷动方块位置:
SetScrollPos (hwnd, iBar, iPos, bRedraw) ;

参数iPos是新位置,它必须在iMin至iMax的范围内。Windows提供了类似的函数(GetScrollRange和GetScrollPos)来取得滚动条的目前范围和位置。
*******************************************************************
设定映射方式:

SetMapMode (hdc, iMapMode) ; 设定映射方式

其中,iMapMode是8个映像方式标识符之一。您可以通过以下呼叫取得目前的映像方式:

iMapMode = GetMapMode (hdc) ; 取得映射方式
*******************************
滚动条函数
SCROLLINFO si;先定义SCROLLINFO数组si
si.cbSize = sizeof (si) ;或si.cbSize = sizeof (SCROLLINFO) ;
SetScrollInfo (hwnd, iBar, &si, bRedraw) ;

GetScrollInfo (hwnd, iBar, &si) ;

像在其它滚动条函数中那样,iBar参数是SB_VERT或SB_HORZ,它还可以是用于滚动条控制的SB_CTL。SetScrollInfo的最后一个参数可以是TRUE或FALSE,指出了是否要Windows重新绘制计算了新信息后的滚动条。
*****************************************************
SetPixel函数在指定的x和y坐标以特定的颜色设定图素:
SetPixel (hdc, x, y, crColor) ;
如同在任何绘图函数中一样,第一个参数是设备内容的句柄。第二个和第三个参数指明了坐标位置。通常要获得窗口显示区域的设备内容,并且x和y相对于该显示区域的左上

角。最后一个参数是COLORREF型态指定了颜色。如果在函数中指定的颜色视讯显示器不支持,则函数将图素设定为最接近的纯色并从函数传回该值。

GetPixel函数传回指定坐标处的图素颜色:
crColor = GetPixel (hdc, x, y) ;
********************************************************************
指定字符串结束的图素位置,而不是指定字符串的开始位置,以此向右对齐数值,是否会容易一些呢?用SetTextAlign函数就可以做到这一点。在SYSMETS1呼叫:

SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

之后,传给后续TextOut函数的坐标将指定字符串的右上角,而不是左上角。
*******************************************************************
SetViewportOrgEx (hdc, 0, 0, NULL) ; 改变视端口原点

SetWindowOrgEx 改变窗口原点
******************************************************************
CreatePen函数的语法形如: 创建画笔

hPen = CreatePen (iPenStyle, iWidth, crColor) ;

其中,iPenStyle参数确定画笔是实线、点线还是虚线,该参数可以是WINGDI.H表头文件中定义的以下标识符,图5-14显示了每种画笔产生的画笔样式。
对于PS_SOLID、PS_NULL和PS_INSIDEFRAME画笔样式,iWidth参数是画笔的宽度。iWidth值为0则意味着画笔宽度为一个图素。现有画笔是一个图素宽。如果指定的是点划线或者虚线式画笔样式,同时又指定一个大于1的实际宽度,那么Windows将使用实线画笔来代替。

CreatePen的crColor参数是一个COLORREF值,它指定画笔的颜色。对于除了PS_INSIDEFRAME之外的画笔样式,如果将画笔选入设备内容中,Windows会将颜色转换为设备所能表示的最相近的纯色。PS_INSIDEFRAME是唯一一种可以使用混色的画笔样式,并且只有在宽度大于1的情况下才如此。

在与定义一个填入区域的函数一起使用时,PS_INSIDEFRAME画笔样式还有另外一个奇特之处:对于除了PS_INSIDEFRAME以外的所有画笔样式来说,如果用来画边界框的画笔宽度大于1个图素,那么画笔将居中对齐在边界框在线,这样边界框线的一部分将位于边界框之外;而对于PS_INSIDEFRAME画笔样式来说,整条边界框线都画在边界框之内。

您也可以通过建立一个型态为LOGPEN(「逻辑画笔」)的结构,并呼叫CreatePenIndirect来建立画笔。如果您的程序使用许多能在原始码中初始化的画笔,那么使用这种方法将有效得多。

要使用CreatePenIndirect,首先定义一个LOGPEN型态的结构:

LOGPEN logpen ;

此结构有三个成员:lopnStyle(无正负号整数或UINT)是画笔样式,lopnWidth(POINT结构)是按逻辑单位度量的画笔宽度,lopnColor (COLORREF)是画笔颜色。Windows只使用lopnWidth结构的x值作为画笔宽度,而忽略y值。

将结

构的地址传递给CreatePenIndirect结构就可以建立画笔了:
hPen = CreatePenIndirect (&logpen) ;

注意,CreatePen和CreatePenIndirect函数不需要设备内容句柄作为参数。这些函数建立与设备内容没有联系的逻辑画笔。直到呼叫SelectObject之后,画笔才与设备内容发生联系。因此,可以对不同的设备(如屏幕和打印机)使用相同的逻辑画笔。

下面是建立、选择和删除画笔的一种方法。假设您的程序使用三种画笔-一种宽度为1的黑画笔、一种宽度为3的红画笔和一种黑色点式画笔,您可以先定义三个变量来存放这些画笔的句柄:

static HPEN hPen1, hPen2, hPen3 ;

在处理WM_CREATE期间,您可以建立这三种画笔:

hPen1 = CreatePen (PS_SOLID, 1, 0) ;

hPen2 = CreatePen (PS_SOLID, 3, RGB (255, 0, 0)) ;

hPen3 = CreatePen (PS_DOT, 0, 0) ;

在处理WM_PAINT期间,或者是在拥有一个设备内容有效句柄的任何时间里,您都可以将这三个画笔之一选进设备内容并用它来画线:

SelectObject (hdc, hPen2) ;
画线函数

SelectObject (hdc, hPen1) ;

其它画线函数

在处理WM_DESTROY期间,您可以删除您建立的三种画笔:

DeleteObject (hPen1) ;

DeleteObject (hPen2) ;

DeleteObject (hPen3) ;

这是建立、选择和删除画笔最直接的方法。但是您的程序必须知道执行期间需要哪些逻辑画笔,为此,您可能想要在每个WM_PAINT消息处理期间建立画笔,并在呼叫EndPaint之后删除它们(您可以在呼叫EndPaint之前删除它们,但是要小心,不要删除设备内容中目前选择的画笔)。

您可能还希望随时建立画笔,并将CreatePen和SelectObject呼叫组合到同一个叙述中:

SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0))) ;

现在再开始画线,您将使用一个红色虚线画笔。在画完红色虚线之后,可以删除画笔。糟了!由于没有保存画笔句柄,怎么才能删除这些画笔呢?不要紧,请记住,SelectObject将传回设备内容中上一次选择的画笔句柄。所以,您可以通过呼叫SelectObject将BLACK_PEN选进设备内容,并删除从SelectObject传回的值:
DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN))) ;

下面是另一种方法,在将新建立的画笔选进设备内容时,保存SelectObject传回的画笔句柄:

hPen = SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0))) ;

现在hPen是什么呢?如果这是在取得设备内容之后第一次呼叫SelectObject,则hPen是BLACK_PEN对象的句柄。现在,可以将hPen选进设备内容,并删除所建立的画笔(第二次SelectObject呼叫传回的句柄),只要一道叙述即可:

DeleteObject (SelectObject (hdc, hPen)) ;

如果有一个画笔的句柄

,就可以通过呼叫GetObject取得LOGPEN结构各个成员的值:

GetObject (hPen, sizeof (LOGPEN), (LPVOID) &logpen) ;

如果需要目前选进设备内容的画笔句柄,可以呼叫:

hPen = GetCurrentObject (hdc, OBJ_PEN) ;

在第十七章将讨论另一个建立画笔的函数ExtCreatePen。

填入空隙


使用点式画笔和虚线画笔会产生一个有趣的问题:点和虚线之间的空隙会怎样呢?您所需要的是什么?

空隙的着色取决于设备内容的两个属性-背景模式和背景颜色。内定背景模式为OPAQUE,在这种方式下,Windows使用背景色来填入空隙,内定的背景色为白色。这与许多程序在窗口类别中用WHITE_BRUSH来擦除窗口背景的做法是一致的。

您可以通过如下呼叫来改变Windows用来填入空隙的背景色:

SetBkColor (hdc, crColor) ;

与画笔色彩所使用的crColor参数一样,Windows将这里的背景色转换为纯色。可以通过用GetBkColor来取得设备内容中定义的目前背景色。

通过将背景模式转换为TRANSPARENT,可以阻止Windows填入空隙:

SetBkMode (hdc, TRANSPARENT) ;

此后,Windows将忽略背景色,并且不填入空隙,可以通过呼叫GetBkMode来取得目前背景模式(TRANSPARENT或者OPAQUE)。

相关主题
文本预览
相关文档 最新文档