Windows程序设计-输出文字

21 篇文章 0 订阅

WM_PAINT消息

窗口消息处理程序会接收到一个WM_PAINT消息的事件:

  • 在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。
  • 使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。
  • 程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分。
  • 程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。

Windows可能发送WM_PAINT消息的事件:

  • Windows擦除覆盖了部分窗口的对话框或消息框。
  • 菜单下拉出来,然后被释放。
  • 显示工具提示消息。

Windows总是保存它所覆盖的显示区域,然后恢复它的事件:

  • 鼠标光标穿越显示区域。
  • 图标拖过显示区域。

有效矩形和无效矩形

需要重新渲染的区域就是无效矩阵。渲染之后,要设置为有效矩阵。
可以通过调用Windows函数InvalidateRect使显示区域中的矩形失效。

取得设备内容句柄

方法一
PAINTSTRUCT ps ;
HDC hdc ;

caseWM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
// 使用GDI函数
EndPaint (hwnd, &ps) ;
return 0 ;
// 绘图结构
typedef struct tagPAINTSTRUCT {
    HDC         hdc;
    BOOL        fErase; // False表示Windows已经擦除了无效矩形的背景
    // RECT结构定义了一个矩形,其四个字段为left、top、right和bottom。 是无效矩形,还是一个剪取矩形
    RECT        rcPaint;
    BOOL        fRestore;
    BOOL        fIncUpdate;
    BYTE        rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;
方法二
ReleaseDC:
hdc = GetDC (hwnd) ;
// 使用GDI函数

ReleaseDC (hwnd, hdc) ;

与BeginPaint和EndPaint一样,GetDC和ReleaseDC函数必须成对地使用。

ValidateRect (hwnd, NULL) ; //使整个显示区域有效

TextOut:细节

TextOut (
hdc,  // 设备内容句柄 设备内容的属性控制了被显示的字符串的特征。
x,  // 显示区域内字符串的开始位置,x是水平位置,y是垂直位置
y,
psText,  // 指向字符串的指针
iLength  // 字符串中字符的个数
) ;

字符大小

TEXTMETRIC tm;  // GetTextMetrics传回设备内容中目前选取的字体信息
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;  // 可以查看文字尺寸结构中的值
ReleaseDC (hwnd, hdc) ;

滚动条信息函数

SetScrollInfo和GetScrollInfo函数的语法是

SCROLLINFO si ;
SetScrollInfo (hwnd, iBar, &si, bRedraw) ;
GetScrollInfo (hwnd, iBar, &si) ;

综合使用

sysmets
sysmets.h

#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))
struct
{
    int iIndex;
    TCHAR * szLabel;
    TCHAR * szDesc;
}
sysmetrics[] =
{
    SM_CXSCREEN, TEXT("SM_CXSCREEN"),
    TEXT("Screen width in pixels"),
    SM_CYSCREEN, TEXT("SM_CYSCREEN"),
    TEXT("Screen height in pixels"),
    SM_CXVSCROLL, TEXT("SM_CXVSCROLL"),
    TEXT("Vertical scroll width"),
    SM_CYHSCROLL, TEXT("SM_CYHSCROLL"),
    TEXT("Horizontal scroll height"),
    SM_CYCAPTION, TEXT("SM_CYCAPTION"),
    TEXT("Caption bar height"),
    SM_CXBORDER, TEXT("SM_CXBORDER"),
    TEXT("Window border width"),
    SM_CYBORDER, TEXT("SM_CYBORDER"),
    TEXT("Window border height"),
    SM_CXFIXEDFRAME,TEXT("SM_CXFIXEDFRAME"),
    TEXT("Dialog window frame width"),
    SM_CYFIXEDFRAME,TEXT("SM_CYFIXEDFRAME"),
    TEXT("Dialog window frame height"),
    SM_CYVTHUMB, TEXT("SM_CYVTHUMB"),
    TEXT("Vertical scroll thumb height"),
    SM_CXHTHUMB, TEXT("SM_CXHTHUMB"),
    TEXT("Horizontal scroll thumb width"),
    SM_CXICON, TEXT("SM_CXICON"),
    TEXT("Icon width"),
    SM_CYICON, TEXT("SM_CYICON"),
    TEXT("Icon height"),
    SM_CXCURSOR, TEXT("SM_CXCURSOR"),
    TEXT("Cursor width"),
    SM_CYCURSOR, TEXT("SM_CYCURSOR"),
    TEXT("Cursor height"),
    SM_CYMENU, TEXT("SM_CYMENU"),
    TEXT("Menu bar height"),
    SM_CXFULLSCREEN,TEXT("SM_CXFULLSCREEN"),
    TEXT("Full screen client area width"),
    SM_CYFULLSCREEN,TEXT("SM_CYFULLSCREEN"),
    TEXT("Full screen client area height"),
    SM_CYKANJIWINDOW,TEXT("SM_CYKANJIWINDOW"),
    TEXT("Kanji window height"),
    SM_MOUSEPRESENT, TEXT("SM_MOUSEPRESENT"),
    TEXT("Mouse present flag"),
    SM_CYVSCROLL, TEXT("SM_CYVSCROLL"),
    TEXT("Vertical scroll arrow height"),
    SM_CXHSCROLL, TEXT("SM_CXHSCROLL"),
    TEXT("Horizontal scroll arrow width"),
    SM_DEBUG, TEXT("SM_DEBUG"),
    TEXT("Debug version flag"),
    SM_SWAPBUTTON, TEXT("SM_SWAPBUTTON"),
    TEXT("Mouse buttons swapped flag"),
    SM_CXMIN, TEXT("SM_CXMIN"),
    TEXT("Minimum window width"),
    SM_CYMIN, TEXT("SM_CYMIN"),
    TEXT("Minimum window height"),
    SM_CXSIZE, TEXT("SM_CXSIZE"),
    TEXT("Min/Max/Close button width"),
    SM_CYSIZE, TEXT("SM_CYSIZE"),
    TEXT("Min/Max/Close button height"),
    SM_CXSIZEFRAME, TEXT("SM_CXSIZEFRAME"),
    TEXT("Window sizing frame width"),
    SM_CYSIZEFRAME, TEXT("SM_CYSIZEFRAME"),
    TEXT("Window sizing frame height"),
    SM_CXMINTRACK, TEXT("SM_CXMINTRACK"),
    TEXT("Minimum window tracking width"),
    SM_CYMINTRACK, TEXT("SM_CYMINTRACK"),
    TEXT("Minimum window tracking height"),
    SM_CXDOUBLECLK, TEXT("SM_CXDOUBLECLK"),
    TEXT("Double click x tolerance"),
    SM_CYDOUBLECLK, TEXT("SM_CYDOUBLECLK"),
    TEXT("Double click y tolerance"),
    SM_CXICONSPACING,TEXT("SM_CXICONSPACING"),
    TEXT("Horizontal icon spacing"),
    SM_CYICONSPACING,TEXT("SM_CYICONSPACING"),
    TEXT("Vertical icon spacing"),
    SM_MENUDROPALIGNMENT, TEXT("SM_MENUDROPALIGNMENT"),
    TEXT("Left or right menu drop"),
    SM_PENWINDOWS, TEXT("SM_PENWINDOWS"),
    TEXT("Pen extensions installed"),
    SM_DBCSENABLED, TEXT("SM_DBCSENABLED"),
    TEXT("Double-Byte Char Set enabled"),
    SM_CMOUSEBUTTONS, TEXT("SM_CMOUSEBUTTONS"),
    TEXT("Number of mouse buttons"),
    SM_SECURE, TEXT("SM_SECURE"),
    TEXT("Security present flag"),
    SM_CXEDGE, TEXT("SM_CXEDGE"),
    TEXT("3-D border width"),
    SM_CYEDGE, TEXT("SM_CYEDGE"),
    TEXT("3-D border height"),
    SM_CXMINSPACING, TEXT("SM_CXMINSPACING"),
    TEXT("Minimized window spacing width"),
    SM_CYMINSPACING, TEXT("SM_CYMINSPACING"),
    TEXT("Minimized window spacing height"),
    SM_CXSMICON, TEXT("SM_CXSMICON"),
    TEXT("Small icon width"),
    SM_CYSMICON, TEXT("SM_CYSMICON"),
    TEXT("Small icon height"),
    SM_CYSMCAPTION, TEXT("SM_CYSMCAPTION"),
    TEXT("Small caption height"),
    SM_CXSMSIZE, TEXT("SM_CXSMSIZE"),
    TEXT("Small caption button width"),
    SM_CYSMSIZE, TEXT("SM_CYSMSIZE"),
    TEXT("Small caption button height"),
    SM_CXMENUSIZE, TEXT("SM_CXMENUSIZE"),
    TEXT("Menu bar button width"),
    SM_CYMENUSIZE, TEXT("SM_CYMENUSIZE"),
    TEXT("Menu bar button height"),
    SM_ARRANGE, TEXT("SM_ARRANGE"),
    TEXT("How minimized windows arranged"),
    SM_CXMINIMIZED, TEXT("SM_CXMINIMIZED"),
    TEXT("Minimized window width"),
    SM_CYMINIMIZED, TEXT("SM_CYMINIMIZED"),
    TEXT("Minimized window height"),
    SM_CXMAXTRACK, TEXT("SM_CXMAXTRACK"),
    TEXT("Maximum draggable width"),
    SM_CYMAXTRACK, TEXT("SM_CYMAXTRACK"),
    TEXT("Maximum draggable height"),
    SM_CXMAXIMIZED, TEXT("SM_CXMAXIMIZED"),
    TEXT("Width of maximized window"),
    SM_CYMAXIMIZED, TEXT("SM_CYMAXIMIZED"),
    TEXT("Height of maximized window"),
    SM_NETWORK, TEXT("SM_NETWORK"),
    TEXT("Network present flag"),
    SM_CLEANBOOT, TEXT("SM_CLEANBOOT"),
    TEXT("How system was booted"),
    SM_CXDRAG, TEXT("SM_CXDRAG"),
    TEXT("Avoid drag x tolerance"),
    SM_CYDRAG, TEXT("SM_CYDRAG"),
    TEXT("Avoid drag y tolerance"),
    SM_SHOWSOUNDS, TEXT("SM_SHOWSOUNDS"),
    TEXT("Present sounds visually"),
    SM_CXMENUCHECK, TEXT("SM_CXMENUCHECK"),
    TEXT("Menu check-mark width"),
    SM_CYMENUCHECK, TEXT("SM_CYMENUCHECK"),
    TEXT("Menu check-mark height"),
    SM_SLOWMACHINE, TEXT("SM_SLOWMACHINE"),
    TEXT("Slow processor flag"),
        SM_MIDEASTENABLED, TEXT("SM_MIDEASTENABLED"),
        TEXT("Hebrew and Arabic enabled flag"),
        SM_MOUSEWHEELPRESENT, TEXT("SM_MOUSEWHEELPRESENT"),
        TEXT("Mouse wheel present flag"),
        SM_XVIRTUALSCREEN, TEXT("SM_XVIRTUALSCREEN"),
        TEXT("Virtual screen x origin"),
        SM_YVIRTUALSCREEN, TEXT("SM_YVIRTUALSCREEN"),
        TEXT("Virtual screen y origin"),
        SM_CXVIRTUALSCREEN, TEXT("SM_CXVIRTUALSCREEN"),
        TEXT("Virtual screen width"),
        SM_CYVIRTUALSCREEN, TEXT("SM_CYVIRTUALSCREEN"),
        TEXT("Virtual screen height"),
        SM_CMONITORS, TEXT("SM_CMONITORS"),
        TEXT("Number of monitors"),
        SM_SAMEDISPLAYFORMAT, TEXT("SM_SAMEDISPLAYFORMAT"),
        TEXT("Same color format flag")
};

main.cpp

#include <windows.h>
#include "sysmets.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("SysMets3");
    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("Program requires Windows NT!"),
            szAppName, MB_ICONERROR);
        return 0;
    }
    hwnd = CreateWindow(szAppName, TEXT("Get System Metrics No. 3"),
        WS_OVERLAPPEDWINDOW | WS_VSCROLL |
        WS_HSCROLL,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL);
    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)
{
    static int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth;
    HDC hdc;
    int i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd;
    PAINTSTRUCT ps;
    SCROLLINFO si;
    TCHAR szBuffer[10];
    TEXTMETRIC tm;
    switch (message)
    {
    case WM_CREATE:
        hdc = GetDC(hwnd);
        GetTextMetrics(hdc, &tm);
        cxChar = tm.tmAveCharWidth;
        cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
        cyChar = tm.tmHeight + tm.tmExternalLeading;
        ReleaseDC(hwnd, hdc);
        // Save the width of the three columns
        iMaxWidth = 40 * cxChar + 22 * cxCaps;
        return 0;
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        // Set vertical scroll bar range and page size
        si.cbSize = sizeof(si);
        si.fMask = SIF_RANGE | SIF_PAGE;
        si.nMin = 0;
        si.nMax = NUMLINES - 1;
        si.nPage = cyClient / cyChar;
        SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
        // Set horizontal scroll bar range and page size
        si.cbSize = sizeof(si);
        si.fMask = SIF_RANGE | SIF_PAGE;
        si.nMin = 0;
        si.nMax = 2 + iMaxWidth / cxChar;
        si.nPage = cxClient / cxChar;
        SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
        return 0;
    case WM_VSCROLL:
        // Get all the vertical scroll bar information
        si.cbSize = sizeof(si);
        si.fMask = SIF_ALL;
        GetScrollInfo(hwnd, SB_VERT, &si);
        // Save the position for comparison later on
        iVertPos = si.nPos;
        switch (LOWORD(wParam))
        {
        case SB_TOP:
            si.nPos = si.nMin;
            break;
        case SB_BOTTOM:
            si.nPos = si.nMax;
            break;
        case SB_LINEUP:
            si.nPos -= 1;
            break;
        case SB_LINEDOWN:
            si.nPos += 1;
            break;
        case SB_PAGEUP:
            si.nPos -= si.nPage;
            break;
        case SB_PAGEDOWN:
            si.nPos += si.nPage;
            break;
        case SB_THUMBTRACK:
            si.nPos = si.nTrackPos;
            break;
        default:
            break;
        }
        // Set the position and then retrieve it. Due to adjustments
        // by Windows it may not be the same as the value set.
        si.fMask = SIF_POS;
        SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
        GetScrollInfo(hwnd, SB_VERT, &si);
        // If the position has changed, scroll the window and update it
        if (si.nPos != iVertPos)
        {
            ScrollWindow(hwnd, 0, cyChar * (iVertPos - si.nPos),
                NULL, NULL);
            UpdateWindow(hwnd);
        }
        return 0;
    case WM_HSCROLL:
        // Get all the vertical scroll bar information
        si.cbSize = sizeof(si);
        si.fMask = SIF_ALL;
        // Save the position for comparison later on
        GetScrollInfo(hwnd, SB_HORZ, &si);
        iHorzPos = si.nPos;
        switch (LOWORD(wParam))
        {
        case SB_LINELEFT:
            si.nPos -= 1;
            break;
        case SB_LINERIGHT:
            si.nPos += 1;
            break;
        case SB_PAGELEFT:
            si.nPos -= si.nPage;
            break;
        case SB_PAGERIGHT:
            si.nPos += si.nPage;
            break;
        case SB_THUMBPOSITION:
            si.nPos = si.nTrackPos;
            break;
        default:
            break;
        }
        // Set the position and then retrieve it. Due to adjustments
        // by Windows it may not be the same as the value set.
        si.fMask = SIF_POS;
        SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
        GetScrollInfo(hwnd, SB_HORZ, &si);
        // If the position has changed, scroll the window
        if (si.nPos != iHorzPos)
        {
            ScrollWindow(hwnd, cxChar * (iHorzPos - si.nPos), 0,
                NULL, NULL);
        }
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        // Get vertical scroll bar position
        si.cbSize = sizeof(si);
        si.fMask = SIF_POS;
        GetScrollInfo(hwnd, SB_VERT, &si);
        iVertPos = si.nPos;
        // Get horizontal scroll bar position
        GetScrollInfo(hwnd, SB_HORZ, &si);
        iHorzPos = si.nPos;
        // Find painting limits
        iPaintBeg = max(0, iVertPos + ps.rcPaint.top / cyChar);
        iPaintEnd = min(NUMLINES - 1,
            iVertPos + ps.rcPaint.bottom / cyChar);
        for (i = iPaintBeg; i <= iPaintEnd; i++)
        {
            x = cxChar * (1 - iHorzPos);
            y = cyChar * (i - iVertPos);
            TextOut(hdc, x, y,
                sysmetrics[i].szLabel,
                lstrlen(sysmetrics[i].szLabel));
            TextOut(hdc, x + 22 * cxCaps, y,
                sysmetrics[i].szDesc,
                lstrlen(sysmetrics[i].szDesc));
            SetTextAlign(hdc, TA_RIGHT | TA_TOP);
            TextOut(hdc, x + 22 * cxCaps + 40 * cxChar, y, szBuffer,
                wsprintf(szBuffer, TEXT("%5d"),
                    GetSystemMetrics(sysmetrics[i].iIndex)));
            SetTextAlign(hdc, TA_LEFT | TA_TOP);
        }
        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
发出的红包

打赏作者

小龙在山东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值