Win32 SDK 学习笔记5

要在指定位置显示文字,用的更多是TextOut()函数。它与DrawText()函数特点不同,作用也不同。

一、TextOut()函数的基本用法

TextOut()函数既不处理回车符、TAB键等,也不自动回行,以指定的位置作基准点,在其附近显示,默认时基准点是这一行字的左上角。要知道当前文字的对齐方式,可以用GetTextAlign()函数,本节先学习与之相对的SetTextAlign()函数。TextOut(hdc, 30, 20, str1, (int)strlen(str1) );

二、文字的对齐方式

SetTextAlign()函数用来设置文字的对齐方式。下面我们以窗口正中间作为基准点来了解这个函数基本内容。

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

    HDC hdc;
    PAINTSTRUCT ps;
    TCHAR str1[] = "My first GDI is so easy and cool!";
    RECT rc;//
    int x;//

    switch(message) {
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            GetClientRect(hWnd, &rc);//
            x = rc.right / 2;//

            SetTextAlign(hdc, TA_LEFT);//左对齐
            TextOut(hdc, x, 20, str1, (int)strlen(str1) );//
            EndPaint(hWnd, &ps);
            break;
    //其中"//"表示左对齐新加的代码      

三、设置文字的字体、大小、方向

#include <windows.h>


TCHAR szWindowClass[] = "My first window's name";
TCHAR szTitle[] = "My first window";

ATOM MyRegisterClass(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HFONT SetMyFont(HDC, LPCTSTR, int, int, int);

int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {
    MSG msg;

    MyRegisterClass(hInstance);

    if ( !InitInstance(hInstance, nShowCmd) ) {
        return FALSE;
    }

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

    return (int)msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance) {
    WNDCLASSEX wc;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_VREDRAW | CS_HREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    wc.hCursor = LoadCursor(hInstance, IDC_SIZEALL);
    wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szWindowClass;
    wc.hIconSm = LoadIcon(wc.hInstance, IDI_APPLICATION);

    return RegisterClassEx(&wc);
}

BOOL InitInstance(HINSTANCE hInstance, int ncmdshow) {
    HWND hWnd;

    hWnd = CreateWindow(szWindowClass,
        szTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        200,
        200,
        NULL,
        NULL,
        hInstance,
        NULL);
    if (!hWnd) {
        return FALSE;
    }
    ShowWindow(hWnd, ncmdshow);
    UpdateWindow(hWnd);

    return TRUE;
}

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

    HDC hdc;
    PAINTSTRUCT ps;

    HFONT hFont, hFontOld;
    TCHAR str1[] = "My first GDI";
    TCHAR str2[] = "星期三";
    TCHAR str3[] = "Configuration";
    int width, height;

    switch(message) {
        case WM_PAINT:
            RECT rc;
            hdc = BeginPaint(hWnd, &ps);
            GetClientRect(hWnd, &rc);
            SetBkMode(hdc, TRANSPARENT);

            width = (rc.right - 20) / (int)strlen(str1);
            height = rc.bottom - 20;

            hFont = SetMyFont(hdc, (LPCTSTR)"黑体", width, height, 90);
            hFontOld = (HFONT)SelectObject(hdc, hFont);
            SetTextColor(hdc, 0xC0C0C0);
            TextOut(hdc, 10, 10, str1, (int)strlen(str1));
            DeleteObject(hFont);

            hFont = SetMyFont(hdc, (LPCTSTR)"楷体", width, height, 450);
            hFontOld = (HFONT)SelectObject(hdc, hFont);
            SetTextColor(hdc, 0xF00000);
            TextOut(hdc, 16, 0, str2, (int)strlen(str2));
            DeleteObject(hFont);

            hFont = SetMyFont(hdc, (LPCTSTR)"宋体", width, height, -90);
            hFontOld = (HFONT)SelectObject(hdc, hFont);
            SetTextColor(hdc, 0x0F0000);
            TextOut(hdc, 0, 10, str3, (int)strlen(str3));
            DeleteObject(hFont);

            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

HFONT SetMyFont(HDC hdc, LPCTSTR face, int width, int height, int angle)
{
    HFONT hFont;
    hFont = CreateFont(
        height,      //字体的逻辑高度
        width,       //逻辑平均字符宽度
        angle,       //与水平线的角度
        0,           //基线方位角度
        FW_REGULAR,  //字形:常规
        FALSE,       //字形:斜体
        FALSE,       //字形:下划线
        FALSE,       //字形:粗体
        GB2312_CHARSET,          //字符集
        OUT_DEFAULT_PRECIS,      //输出精度
        CLIP_DEFAULT_PRECIS,     //剪截精度
        PROOF_QUALITY,           //输出品质
        FIXED_PITCH | FF_MODERN, //倾斜度
        face                     //字体
        ); 
    return hFont;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值