VC++ WIN32 sdk实现按钮自绘详解.

本文详细探讨了如何使用VC++的WIN32 SDK进行按钮的自定义绘制,涵盖了从理解默认样式到应用自定义画笔、刷子等技巧,通过实例代码解析实现过程,帮助开发者掌握这一高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

网上找了很多 , 可只是给出代码 , 没有详细解释 , 不便初学者理解 . 我就抄回冷饭 . 把这个再拿出来说说 .
实例图片 :
 
首先建立一个标准的 Win32 Application 工程 . 选择 a simple Win32 Application.
然后建立我们的资源文件首先新建一个对话框资源 , 资源 ID 改为 IDD_MAIN_DLG
然后在其上新建一个按钮控件资源 ID 改为 IDC_ODBUTTON, 此按钮的 styles 中必须选中 owenerdraw 属性 .
然后将其保存为 .rc 的资源文件 . 并将其导入我们的工程 . 同理新建一个图标文件资源 ID 改为 IDI_OWNERDRAW 保存为 .ico 的图标然后导入 .
准备工作做完了下面开始写代码 .
首先声明如下全局变量.
#include "stdafx.h"
#include "resource.h"
   HINSTANCE odInst = NULL;   // 接收程序实例的句柄
HWND hMainWnd = NULL;      // 接收主窗口的句柄
HWND hDlgNow = NULL;       // 接收对话框的句柄
static  HICON hOwnerDrawIcon = NULL;   // 用作自绘按钮的图标
static  LONG prev_proc;                  // 储存按钮先前的回调函数
static  HICON hIcon = NULL;            // 对话框图标句柄
然后开始写WinMain()函数
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     
int       nCmdShow)
...{
     
// TODO: Place code here.
    odInst = hInstance;
    
    WNDCLASS  wc;
    wc.style         = 0;
    wc.lpfnWndProc   = (WNDPROC)ODWndProc; 
//
定义一个窗口默认函数 , 这里我们会交由默认窗口函数处理
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(odInst,MAKEINTRESOURCE(IDI_OWNERDRAW));
    wc.hCursor       = NULL;
    wc.hbrBackground = 0;
    wc.lpszClassName = "OwnerDraw";
    wc.lpszMenuName     = NULL;

    RegisterClass(&wc);

MSG msg;
    
    HWND onlywin= FindWindow("OwnerDraw","MyOwnerDraw");

    
if  (onlywin)
        
... {
        ExitProcess(1);
        }
    
    hMainWnd=CreateWindow("OwnerDraw","MyOwnerDraw",WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);

    
    
if  (!hMainWnd)
        
... {
            
return  FALSE;
        }

    
    hDlgNow = DoMainDlg(hMainWnd);
    ShowWindow(hDlgNow, nCmdShow);


    
while (GetMessage(&msg, NULL, 0, 0)) 
    
... {
        
if  (NULL == hDlgNow || !IsDialogMessage(hDlgNow, &msg))
        
... {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    
return  msg.wParam;
}
 
首先注册一个标准的窗口类 , WNDCLASS 结构体 , 默认的窗口过程为 ODWndProc. 其定义如下 .
LRESULT CALLBACK ODWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
...{
    
return DefWindowProc(hWnd, message, wParam, lParam);//
返回系统默认的窗口过程
}
   然后判断有无相同实例存在如有则结束之
HWND onlywin= FindWindow("OwnerDraw","MyOwnerDraw");

    if (onlywin)
        
...{
        ExitProcess(1);
        }
 
接下来创建主窗口 </
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值