《Winodws API每日一练》8.2 static控件

在 Windows 编程中,"Static" 控件是一种常见的用户界面元素,用于显示静态文本或图像,而无法进行用户交互。它通常用于显示标签、标题、说明文本或静态图像等信息。Static 控件是一种静态的、只读的显示元素,不接受用户的输入或操作。

本节必须掌握的知识点:

        静态类

        第51练:静态文本控件

8.2.1 静态类

用CreateWindow函数和“静态” (static)窗口类来创建静态子窗口控件。静态类子窗口控件不接受鼠标或键盘输入,也不会向其父窗口发送WM_COMMAND 消息。

在使用 Win32 API 进行开发时,可以使用 CreateWindow 函数创建 Static 控件。需要指定控件的类名为 "STATIC",样式为 SS_LEFT 或 SS_CENTER 等来控制文本对齐方式。

HWND hStatic = CreateWindow("STATIC", "Static Text", WS_CHILD | WS_VISIBLE, x, y,

width, height, hParent, NULL, hInstance, NULL);

当你在一个静态子窗口上移动或单击鼠标时,子窗口会俘获WM_NCHITTEST消息 并向Windows返回HTTRANSPARENT值。这会导致Windows向其底层窗口(通常是其父窗口)发送相同的WM_NCHITTEST消息。父窗口通常将该消息传给DefWindowProc,在那里它会被转换为客户区鼠标消息。

       ■静态窗口样式

前6个静态窗口样式只是简单地在子窗口的客户区内画一个矩形或框架。“RECT”静

态样式(左栏)是填充的矩形;三个“FRAME”样式(右栏)是内部没有被填充的矩形边框。

SS_BLACKRECT           SS_GRAYFRAME

SS_WHITERECT           SS_BLACKFRAME

SS_GRAYRECT                SS WHITEFRAME

“BLACK”、“GRAY”和“WHITE”并不意味实际的黑色、灰色和白色。它们更多的是基于下表所示的系统颜色。

静态控件

系统颜色

BLACK

COLOR_3DDKSHADOW

GRAY

COLOR_BTNSHADOW

WHITE

COLOR_BTNHIGHLIGHT

对于这些样式,CreateWindow调用的窗口文本字段将被忽略。矩形左上角的x和y 坐标是相对于父窗口的。也可以使用SS_ETCHEDHORZ ,SS_ETCHEDVERT或 SS_ETCHEDFRAME样式来用白色和灰色创建一个阴影框架。

静态类还包括三个文本样式:SS_LEFT,SS_RIGHT和SS_CENTER。这些样式会创建左对齐、右对齐和居中对齐的文本。相应的文本由CreateWindow函数的窗口文本参数指定,可以被SetWindowText修改。当静态控件的窗口过程显示此文本时,它会使用 DT_WORDBREAK, DT_NOCLIP 和 DT_EXPANDTABS 等参数来调用 DrawText 函数。 子窗口矩形框具有文本自动换行功能。

这三个文本样式子窗口的背景颜色通常是COLOR_BTNFACE,文本本身颜色是 COLOR_WINDOWTEXT。你可以俘获 WM_CTLCOLORSTATIC 消息,调用 SetTextColor 和SetBkColor分别改变文本颜色和背景颜色,同时返回背景画刷的句柄。

最后,静态类还包括两个窗口样式,分别为SS_ICON和SS_USERITEM。然而,当它们被用来作为子窗口控件时,这些样式是毫无意义的。我们会在讨论对话框的时候再次讨论它们。

样式

说明

SS_BLACKRECT/SS_BLACKFRAME

填充矩形或画边框,分别对应的系统颜色为COLOR_3DDSHADOWCOLOR_BTNSHADOWCOLOR_BTNHIGHLIGHT。在CreateWindow调用的窗口文本字段将被忽略(因为被填充了)。坐标是相对于父窗口的

SS_GRAYRECT / SS_GRAYRECT

SS_WHITERECT/SS_WHITEFRAME

SS_ETCHEDHORZ

用白色和灰色,建立一个边框,并将顶端边框设置为浮雕风格

SS_ETCHEDVERT

用白色和灰色,建立一个边框,并将左侧边框设置为浮雕风格

SS_ETCHEDFRAME

建立一个浮雕边框(阴影边框)

SS_LEFT

文本的对齐方式,相应的文本由CreateWindow的文本参数指定,可通过SetWindowsText修改。窗口过程内部使用DrawText函数带DT_WORDBREAKDT_NOCLIPDT_EXPANDTABS参数来显文本

SS_RIGHT

SS_CENTER

SS_ICON

作为子窗口控件时,该样式是无意义的。

SS_USERITEM

8.2.2 第51练:静态文本控件

/*------------------------------------------------------------------

051  WIN32 API 每日一练

     第51个例子STATIC_TEXT.C:静态文本控件

     SetWindowText函数

(c) www.bcdaren.com, 2020

----------------------------------------------------------------*/

#include <windows.h>

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

HINSTANCE hInst;//全局变量

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

 PSTR szCmdLine, int iCmdShow)

{

     static TCHAR szAppName[] = TEXT("Static Demo");

    (略)

     return msg.wParam;

}

//窗口过程

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

{

    PAINTSTRUCT ps;

    HDC hdc;

    //必须被设置为静态变量

    static int iClick = 0;  //鼠标单击次数

    static TCHAR szTextBuf[20];  //static 控件文本(缓冲区)

    static HWND hStatic//static 控件句柄

    static RECT  rect;

    static cxClient,cyClient;

    switch (message)

     {

     case  WM_CREATE:

          //获取窗口客户区宽和高

          GetClientRect(hWnd,&rect);

          hStatic = CreateWindow(

               TEXT("static"), //静态文本框的类名

               TEXT("编程达人"),  //控件的文本

               WS_CHILD| WS_VISIBLE| WS_BORDER|

SS_CENTER| SS_CENTERIMAGE /*垂直居中*/,

               rect.left+50 /*X坐标*/, rect.top+50  /*Y坐标*/,

rect.right/2/*宽度*/, rect.bottom/2 /*高度*/,

               hWnd//父窗口句柄

               (HMENU)1,  //为控件指定一个唯一标识符

               hInst//当前程序实例句柄

               NULL

          );

          break;

     case WM_SIZE:

          cxClient = LOWORD(lParam);

          cyClient = HIWORD(lParam);

//调整窗口          MoveWindow(hStatic,rect.left+cxClient/20,rect.top+cyClient/20,

cxClient/2,cyClient/2,TRUE);

          break;

     case WM_PAINT:

          hdc = BeginPaint(hWnd, &ps);

          // TODO:  在此添加任意绘图代码...

          EndPaint(hWnd, &ps);

          break;

     case WM_LBUTTONDOWN//鼠标左键单击消息

          iClick++;

          wsprintf(szTextBuf, TEXT("鼠标被单击%d次"), iClick);

          SetWindowText(hStatic, szTextBuf);

          break;

     case WM_DESTROY:

          PostQuitMessage(0);

          break;

    }

    return DefWindowProc(hWnd, message, wParam, lParam) ;

}

/******************************************************************************

SetWindowText函数:更改指定窗口标题栏的文本(如果有的话)。如果指定的窗口是控件,则更改控件的文本。

BOOL SetWindowTextA(

  HWND   hWnd,  //要更改其文本的窗口或控件的句柄。

  LPCSTR lpString//新标题或控件文本

);

*/

运行结果:

图8-4 静态文本控件

 

总结

       实例STATIC_TEXT.C的窗口过程在处理WM_CREATE消息时调用CreateWindow函数创建一个“static”子窗口控件。窗口类名使用Windows预定义的静态类”static”,静态类子窗口控件的样式为“WS_CHILD| WS_VISIBLE| WS_BORDER| SS_CENTER| SS_CENTERIMAGE”,WS_CHILD表示子窗口样式,WS_VISIBLE表示可见的,WS_BORDER表示带边框的,SS_CENTER表示文本在窗口客户区内水平方向居中对齐,SS_CENTERIMAGE表示IMAGE图像在窗口客户区内水平垂直居中。CreateWindow返回子窗口控件句柄。使用菜单项ID值1标识静态文本子窗口控件ID。

       WM_SIZE消息调整子窗口控件大小。

       WM_PAINT消息可以在子窗口内绘图。

       M_LBUTTONDOWN消息中,调用SetWindowText指定在静态文本控件中显示鼠标点击次数。

       需要注意的是,Static 控件是一种只读的静态显示元素,无法接收用户的输入或操作。如果需要与用户进行交互,例如允许用户输入文本或点击操作,需要使用其他类型的控件,如 TextBox、Button 等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值