目前共有6篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:不轉換▼
 
點擊 回復
490 5
【教程】在Win32窗口环境中创建按钮,单选框,复选框时,如何去掉对话框背景色
一派掌門 二十級
1樓 發表于:2016-1-10 16:45
先看效果。
修改前:

修改后:

一派掌門 二十級
2樓 發表于:2016-1-10 16:48
【方法】
在窗口的过程处理函数中的switch语句下加入两个case分支:
case WM_CTLCOLORBTN:
  break;
case WM_CTLCOLORSTATIC:
  break;
里面什么也不用做,只需要break就行。
只要不执行DefWindowProc函数就行了。
函数最终返回TRUE或FALSE都行。我返回的是默认的FALSE。
 
一派掌門 二十級
3樓 發表于:2016-1-10 16:49
【参考代码】
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
        {
            SCROLLINFO sci;
            sci.nMin = 0;
            sci.nMax = 5;
            sci.nPage = 1;
            sci.nPos = 0;
            sci.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
            SetScrollInfo(hwnd, SB_VERT, &sci, true);

            HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE);
            HWND button = CreateWindow(WC_BUTTON, TEXT("Click me"), WS_TABSTOP | WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 50, 50, 75, 22, hwnd, NULL, hInst, NULL);
            HWND checkbox = CreateWindow(WC_BUTTON, TEXT("Check me"), WS_TABSTOP | WS_CHILD | WS_VISIBLE | BS_CHECKBOX | BS_AUTOCHECKBOX, 150, 50, 100, 22, hwnd, NULL, hInst, NULL);
        }
        break;
    case WM_CTLCOLORBTN:
        break;
    case WM_CTLCOLORSTATIC:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            TextOut(hdc, 10, 10, TEXT("Something"), 9);
            MoveToEx(hdc, 270, 70, NULL);
            LineTo(hdc, 280, 90);
            EndPaint(hwnd, &ps);
        }
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return FALSE;
}
 
一派掌門 二十級
4樓 發表于:2016-1-10 16:53
加入空白WM_CTLCOLORBTN消息可以清除按钮的背景颜色。
加入空白WM_CTLCOLORSTATIC消息可以清除单选框和复选框的背景颜色。
这是单选框的效果:


当然,还有其他类似的消息,可以清除其他控件的背景颜色:

 
一派掌門 二十級
5樓 發表于:2016-1-10 16:54
为了方便起见,这两个case还可以写在一起:

 
一派掌門 二十級
6樓 發表于:2016-1-10 17:13
這裡順便說下如何把控件上的字體設置為系統默認。
【效果如下】


【代碼】
#include <tchar.h>
#include <Windows.h>
#include <CommCtrl.h>

// 啟用XP風格控件視覺效果
#pragma comment(lib, "Comctl32.lib")
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

HFONT hfontCaption;

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
        {
            // 設置右側滾動條的位置,範圍和長度
            SCROLLINFO sci;
            sci.nMin = 0;
            sci.nMax = 1;
            sci.nPage = 1; // 決定滾動條的滑塊有多長
            sci.nPos = 0;
            sci.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
            SetScrollInfo(hwnd, SB_VERT, &sci, true);

            HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE);
            HWND hButton = CreateWindow(WC_BUTTON, TEXT("Click me"), WS_TABSTOP | WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 50, 50, 75, 22, hwnd, NULL, hInst, NULL); // 創建按鈕
            SendMessage(hButton, WM_SETFONT, (WPARAM)hfontCaption, TRUE); // 設置按鈕字體
            HWND hCheckBox = CreateWindow(WC_BUTTON, TEXT("Check me"), WS_TABSTOP | WS_CHILD | WS_VISIBLE | BS_CHECKBOX | BS_AUTOCHECKBOX, 150, 50, 100, 22, hwnd, NULL, hInst, NULL); // 創建複選框
            SendMessage(hCheckBox, WM_SETFONT, (WPARAM)hfontCaption, TRUE); // 設置複選框字體
            HWND hRadioButton = CreateWindow(WC_BUTTON, TEXT("Select me"), WS_TABSTOP | WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 350, 50, 100, 22, hwnd, NULL, hInst, NULL); // 創建單選框
            SendMessage(hRadioButton, WM_SETFONT, (WPARAM)hfontCaption, TRUE); // 設置單選框字體
        }
        break;

    // 清除控件默認的對話框背景色
    case WM_CTLCOLORBTN:
    case WM_CTLCOLORSTATIC:
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            LPCTSTR str = TEXT("Do something here...");
            SelectObject(hdc, hfontCaption); // 設置輸出文字的字體
            TextOut(hdc, 10, 10, str, _tcslen(str));
            MoveToEx(hdc, 270, 70, NULL);
            LineTo(hdc, 280, 90);
            EndPaint(hwnd, &ps);
        }
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return FALSE;
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    // 註冊窗口類
    WNDCLASSEX wcex;
    ZeroMemory(&wcex, sizeof(WNDCLASSEX));
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hInstance = hInstance;
    wcex.lpfnWndProc = WndProc;
    wcex.lpszClassName = TEXT("MyWindow");
    RegisterClassEx(&wcex);

    // 獲取系統默認文字字體
    NONCLIENTMETRICS ncm;
    OSVERSIONINFO osv;
    osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osv);
    ncm.cbSize = sizeof(NONCLIENTMETRICS);
    if (osv.dwMajorVersion < 6)
        ncm.cbSize -= sizeof(ncm.iPaddedBorderWidth); // 為了支持 Windows XP
    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, NULL);
    hfontCaption = CreateFontIndirect(&ncm.lfCaptionFont);

    // 創建並顯示主窗口
    HWND hwnd = CreateWindow(wcex.lpszClassName, TEXT("Welcome"), WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, 0, 640, 480, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    // 消息循環
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    DeleteObject(hfontCaption); // 當程式退出時,刪除字體物件
    return msg.wParam;
}
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:490 回複數:5
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-1-10 17:13
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。