Win32怎么显示多个图像并且响应图像点击事件?

末影小末EnderMo 2020-04-01 03:24:43
二话不说,把完整代码放出来
#include "framework.h"
#include "FrameworkUI.h"
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#define IDC_2 1002
#define IDC_3 2002
#define IDC_CLOSE 233
#define IDC_MINIMIZE 2233

HINSTANCE g_hInstance;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK BtnProc2(HWND, UINT, WPARAM, LPARAM);//按钮2窗口过程

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// TODO: Place code here.
g_hInstance = hInstance;
TCHAR className[] = TEXT("my class");
TCHAR szBtnName2[] = TEXT("MyBtn2");
WNDCLASS wndclass = { 0 };
wndclass.hInstance = hInstance;
wndclass.hbrBackground = (CreateSolidBrush(RGB(30,30,30)));
wndclass.lpszClassName = className;
wndclass.lpfnWndProc = WindowProc;
wndclass.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_SMALL));

RegisterClass(&wndclass);

HWND hMain = CreateWindow(className, "FrameworkUI", WS_OVERLAPPEDWINDOW, 300, 300, 400, 300, NULL, NULL, hInstance, NULL);

if (!hMain)
{
OutputDebugString("=),");
return 0;
}

ShowWindow(hMain, SW_SHOW);
WNDCLASS wndbtn2 = { 0 };
wndbtn2.cbClsExtra = 0;
wndbtn2.cbWndExtra = 0;
wndbtn2.hbrBackground = CreateSolidBrush(RGB(104, 104, 104));
wndbtn2.hCursor = NULL;
wndbtn2.hIcon = NULL;
wndbtn2.hInstance = hInstance;
wndbtn2.lpfnWndProc = BtnProc2;
wndbtn2.lpszClassName = szBtnName2;
wndbtn2.lpszMenuName = NULL;
wndbtn2.style = CS_HREDRAW | CS_VREDRAW;

if (!RegisterClass(&wndbtn2))
{
MessageBox(NULL, TEXT("RegisterClass wndbtn failed"), TEXT("ERROR"), 0);
return 0;
}
HWND hButton2 = CreateWindow(szBtnName2, TEXT("MyButton2"),
WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hMain, NULL, hInstance, 0);
ShowWindow(hButton2, SW_SHOW);
UpdateWindow(hButton2);

MSG msg;
BOOL ret;
while (ret = GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}
//主窗口过程 PROC
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HFONT hFont;//定义静态字体变量
static HWND close;
static HWND MINIMIZE;
static HWND txt1;
static HWND txt2;
static HWND bt1;
char txt[40];
HDC hdc;
HDC hdcMem;

PAINTSTRUCT ps;
HINSTANCE hInstance;
BITMAP bitmap;

static HBITMAP hBitmap; // 1 静态变量

static int bmWidth, bmHeight; // 2 静态变量

switch (uMsg)
{
case WM_CREATE:
{
hInstance = ((LPCREATESTRUCT)lParam)->hInstance; // 3
hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); // 4
GetObject(hBitmap, sizeof(BITMAP), &bitmap); // 5
bmWidth = bitmap.bmWidth; // 6
bmHeight = bitmap.bmHeight;
hFont = CreateFont(14, 7, 0, 0, 0, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Minecraft");//创建字体
txt1 = CreateWindow("STATIC", "FrameworkUI", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 10, 120, 20, hwnd, (HMENU)IDC_2, g_hInstance, NULL);//创建静态文本
SendMessage(txt1, WM_SETFONT, (WPARAM)hFont, TRUE);//发送设置字体消息
break;
}
case WM_PAINT:

hdc = BeginPaint(hwnd, &ps); // 8

hdcMem = CreateCompatibleDC(hdc); // 9

SelectObject(hdcMem, hBitmap); // 10

BitBlt(hdc, 375, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY); // 11 显示位图

DeleteDC(hdcMem); // 12

EndPaint(hwnd, &ps); // 13

break;
case WM_CTLCOLORSTATIC://拦截WM_CTLCOLORSTATIC消息
{

if ((HWND)lParam == GetDlgItem(hwnd, IDC_2))//2
{
SetTextColor((HDC)wParam, RGB(165, 120, 120));
SetBkMode((HDC)wParam, TRANSPARENT);
}
if ((HWND)lParam == GetDlgItem(hwnd, IDC_CLOSE))//2
{
SetTextColor((HDC)wParam, RGB(199, 0, 0));
SetBkMode((HDC)wParam, TRANSPARENT);
}
if ((HWND)lParam == GetDlgItem(hwnd, IDC_MINIMIZE))//2
{
SetTextColor((HDC)wParam, RGB(199, 0, 0));
SetBkMode((HDC)wParam, TRANSPARENT);
}
return (INT_PTR)GetStockObject((NULL_BRUSH));//返回一个空画刷(必须)
}
case WM_SIZE:
{
LONG_PTR Style = ::GetWindowLongPtr(hwnd, GWL_STYLE);
Style = Style & ~WS_CAPTION & ~WS_SYSMENU & ~WS_SIZEBOX;
::SetWindowLongPtr(hwnd, GWL_STYLE, Style);
break;
}
case WM_LBUTTONDOWN:
{
SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); //向窗口发送WM_NCLBUTTONDOWN消息,HTCAPTION 标题
break;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_2:
MessageBox(hwnd, "标题栏的消息响应(这明明是静态文本)xD", "提示", MB_OK | MB_ICONINFORMATION);
break;
case IDC_3:
MessageBox(hwnd, "您点击了按钮。(我需要告诉你你做了什么)", "提示", MB_OK | MB_ICONINFORMATION);
break;
case IDB_BITMAP1:
{
case WM_DESTROY:
{
DeleteObject(hBitmap); // 14
DeleteObject(hFont);//删除所创建字体对象
PostQuitMessage(0);
break;
}
}
case IDC_MINIMIZE:
{
SendMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); // 最小化
break;
}
break;
}
break;
}
}

return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
//子窗口过程
LRESULT CALLBACK BtnProc2(HWND hBtn2, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps = { 0 };
HDC DC = NULL;
switch (message)
{
case WM_CREATE:
{
MoveWindow(hBtn2, 30, 50, 250, 100, TRUE);
//画椭圆区域,还可以画圆角,多边形等等
HRGN hRgn = CreateRoundRectRgn(10, 10, 600, 50, 0, 10);
SetWindowRgn(hBtn2, hRgn, TRUE);
}
break;
case WM_LBUTTONDOWN:
MessageBox(NULL, TEXT("MyButton2"), TEXT("提示"), 0);
break;
case WM_PAINT:
{
DC = BeginPaint(hBtn2, &ps);
SetBkColor(DC, RGB(104, 104, 104)); //按钮背景颜色
SetTextColor(DC, RGB(210, 210, 210)); //按钮上的文字颜色
TextOut(DC, 20, 19, _T("BUTTON"), 10); //按钮上的文字
EndPaint(hBtn2, &ps);
}
break;
default:
break;
}
return DefWindowProc(hBtn2, message, wParam, lParam);

}

IDB_BITMAP1就是要响应关闭时间的位图,单击IDB_BITMAP1的时候关闭程序,并且想要显示多个图片;
如图,给IDB_BITMAP1加一个事件,再多显示几个图片
...全文
1307 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
有点复杂啊!好难理解
zlxy158 2020-04-04
  • 打赏
  • 举报
回复
好复杂,但可以作为参考了
y_chen_yc 2020-04-04
  • 打赏
  • 举报
回复
虽然看不懂 但是感觉很牛逼的样子
asdfgrjui 2020-04-04
  • 打赏
  • 举报
回复
学习一下新知识
HMIAOERDAI 2020-04-04
  • 打赏
  • 举报
回复
点赞的吃瓜群众
b15221400 2020-04-04
  • 打赏
  • 举报
回复
点赞好牛的在这里。。。。。。。。。。。。。。。。。。。。。。
Yukun6 2020-04-04
  • 打赏
  • 举报
回复
6666666
luchen666 2020-04-04
  • 打赏
  • 举报
回复
也是急需下载一部技术书籍,然而没有c币,学生党也冲不起会员,只好来尝试一下靠评论转积分了...不知道有没有效果,总之先试一试好了...输了这么多字差不多也应该足够了 每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分 你还可以输入10000个字符 提交回复(Ctrl+Enter)
schlafenhamster 2020-04-03
  • 打赏
  • 举报
回复
改错了,按 我的代码写 ,不能 合并 到 paint 里 !
  • 打赏
  • 举报
回复
不知道为什么把那两串代码放到WM_PAINT后里没有任何效果,点击最小化之后关闭的位图就消失了 代码放上来看一下,IDB_BITMAP3是HOVER时的图像
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HFONT hFont;//定义静态字体变量
    static HWND close;
    static HWND MINIMIZE;
    static HWND txt1;
    static HWND txt2;
    static HWND bt1;
    static int msLast=WM_MOUSELEAVE;
    char txt[40];
    HDC         hdc =NULL;
    HDC hdc2 = NULL;
    HDC         hdcMem;

    PAINTSTRUCT ps;
    HINSTANCE      hInstance = NULL;
    BITMAP         bitmap;

    static HBITMAP hBitmap;                  // 1 静态变量
    static HBITMAP hBitmap2;

    static int      bmWidth, bmHeight;       // 2 静态变量

 
    switch (uMsg)
    {
    case WM_CREATE:
        {
            hInstance = ((LPCREATESTRUCT)lParam)->hInstance;                 // 3
            hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));   // 4
            GetObject(hBitmap, sizeof(BITMAP), &bitmap);                    // 5
            bmWidth = bitmap.bmWidth;                                        // 6
            bmHeight = bitmap.bmHeight;
            //222222
            hInstance = ((LPCREATESTRUCT)lParam)->hInstance;                 // 3
            hBitmap2 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2));   // 4
            GetObject(hBitmap, sizeof(BITMAP), &bitmap);                    // 5
            bmWidth = bitmap.bmWidth;                                        // 6
            bmHeight = bitmap.bmHeight;
            //222222
            hInstance = ((LPCREATESTRUCT)lParam)->hInstance;                 // 3
            hBitmap2 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2));   // 4
            GetObject(hBitmap, sizeof(BITMAP), &bitmap);                    // 5
            bmWidth = bitmap.bmWidth;                                        // 6
            bmHeight = bitmap.bmHeight;
            //DRAW ^
            hFont = CreateFont(14, 7, 0, 0, 0, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Minecraft");//创建字体
            txt1 = CreateWindow("STATIC", "CommandlineUI", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10, 10, 120, 20, hwnd, (HMENU)IDC_2, g_hInstance, NULL);//创建静态文本
            SendMessage(txt1, WM_SETFONT, (WPARAM)hFont, TRUE);//发送设置字体消息
            break;
        }
    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);                                     // 8

        hdcMem = CreateCompatibleDC(hdc);                                // 9

        SelectObject(hdcMem, hBitmap);                                   // 10

        BitBlt(hdc, 375, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);     // 11 显示位图  

        DeleteDC(hdcMem);                                                // 12
                                   // 8

        hdcMem = CreateCompatibleDC(hdc);                                // 9

        SelectObject(hdcMem, hBitmap2);                                   // 10

        BitBlt(hdc, 347, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);     // 11 显示位图  

        DeleteDC(hdcMem);                                                // 12

        EndPaint(hwnd, &ps);                                             // 13

        hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP3));
        hdc2 = GetDC(hwnd);
        hdcMem = CreateCompatibleDC(hdc);
        SelectObject(hdcMem, hBitmap);
        BitBlt(hdc, 375, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);     // 11 显示位图  
        ReleaseDC(hwnd, hdcMem);
        ReleaseDC(hwnd, hdc);
        msLast = WM_MOUSEHOVER;
        hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
        hdc = GetDC(hwnd);
        hdcMem = CreateCompatibleDC(hdc);
        SelectObject(hdcMem, hBitmap);
        BitBlt(hdc, 375, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);
        ReleaseDC(hwnd, hdcMem);
        ReleaseDC(hwnd, hdc);
        msLast = WM_MOUSELEAVE;
        break;
    case WM_CTLCOLORSTATIC://拦截WM_CTLCOLORSTATIC消息
        {
             
            if ((HWND)lParam == GetDlgItem(hwnd, IDC_2))//2
            {
                SetTextColor((HDC)wParam, RGB(165, 120, 120));
                SetBkMode((HDC)wParam, TRANSPARENT);
            }
            if ((HWND)lParam == GetDlgItem(hwnd, IDC_CLOSE))//2
            {
                SetTextColor((HDC)wParam, RGB(199, 0, 0));
                SetBkMode((HDC)wParam, TRANSPARENT);
            }
            if ((HWND)lParam == GetDlgItem(hwnd, IDC_MINIMIZE))//2
            {
                SetTextColor((HDC)wParam, RGB(199, 0, 0));
                SetBkMode((HDC)wParam, TRANSPARENT);
            }
            return (INT_PTR)GetStockObject((NULL_BRUSH));//返回一个空画刷(必须)
        }

    case WM_MOUSEMOVE:
    {
        if (BmpHitTest(hwnd, lParam) > 0)
        {
            if (msLast == WM_MOUSELEAVE) SendMessage(hwnd, WM_MOUSEHOVER, 0, 0);
        }
        else
        {
            if (msLast == WM_MOUSEHOVER) SendMessage(hwnd, WM_MOUSELEAVE, 0, 0);
        }
        TRACKMOUSEEVENT tme;
        tme.cbSize = sizeof(TRACKMOUSEEVENT);
        tme.dwFlags = TME_HOVER | TME_LEAVE;
        tme.dwHoverTime = 15;
      	tme.hwndTrack = hwnd;
        _TrackMouseEvent(&tme);
        break;
    }
    case WM_MOUSEHOVER:
    {// red
        hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP3));
        hdc2 = GetDC(hwnd);
        hdcMem = CreateCompatibleDC(hdc);
        SelectObject(hdcMem, hBitmap);
        BitBlt(hdc, 375, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);     // 11 显示位图  
        ReleaseDC(hwnd, hdcMem);
        ReleaseDC(hwnd, hdc);
        msLast = WM_MOUSEHOVER;
        break;
    }
    case WM_MOUSELEAVE:
    {// green
        hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
        hdc = GetDC(hwnd);
        hdcMem = CreateCompatibleDC(hdc);
        SelectObject(hdcMem, hBitmap);
        BitBlt(hdc, 375, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);
        ReleaseDC(hwnd, hdcMem);
        ReleaseDC(hwnd, hdc);
        msLast = WM_MOUSELEAVE;
        break;
    }


    case WM_SIZE:
    {
        LONG_PTR Style = ::GetWindowLongPtr(hwnd, GWL_STYLE);
        Style = Style & ~WS_CAPTION & ~WS_SYSMENU & ~WS_SIZEBOX;
        ::SetWindowLongPtr(hwnd, GWL_STYLE, Style);
        break;
    }
    case WM_LBUTTONDOWN:
    {
        if (BmpHitTest(hwnd, lParam) > 0)
        {
            DeleteObject(hBitmap);
            DeleteObject(hFont);
            PostQuitMessage(0);
            break;
        }
        if (MINIMIZE1(hwnd, lParam) > 0)
        {
            SendMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); // 最小化
            break;
        }
        // 移动 窗口 
        SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);  //向窗口发送WM_NCLBUTTONDOWN消息,HTCAPTION 标题
        break;
    }
    case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                case IDC_2:
                    MessageBox(hwnd, "标题栏的消息响应(这明明是静态文本)xD", "提示", MB_OK | MB_ICONINFORMATION);
                break;
                case IDC_3:
                    MessageBox(hwnd, "您点击了按钮。(我需要告诉你你做了什么)", "提示", MB_OK | MB_ICONINFORMATION);
                break;
                case IDB_BITMAP1:
                {
                    case WM_DESTROY:
                    {
                    DeleteObject(hBitmap);                          // 14
                    DeleteObject(hFont);//删除所创建字体对象
                    PostQuitMessage(0);
                    break;
                    }
                }
                case IDC_MINIMIZE:
                {
                    SendMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); // 最小化
                    break;
                }
                break;
            }
            break;
        }
    }
     
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
  • 打赏
  • 举报
回复
把全部赋值为NULL之后代码可以通过生成了,但是没有效果,我再检查一下我是不是有什么东西搞错了
  • 打赏
  • 举报
回复
引用 24 楼 schlafenhamster 的回复:
1 增加 一个 static int msLast=WM_MOUSELEAVE; 用来 只 重绘 一次 2 改动

	case WM_MOUSEMOVE:
	{
		if(BmpHitTest(hwnd,lParam)>0)
		{
			if(msLast==WM_MOUSELEAVE) SendMessage(hwnd,WM_MOUSEHOVER,0,0);
		}
		else
		{
			if(msLast==WM_MOUSEHOVER) SendMessage(hwnd,WM_MOUSELEAVE,0,0);
		}
//		TRACKMOUSEEVENT tme;
//		tme.cbSize = sizeof(TRACKMOUSEEVENT);
//		tme.dwFlags = TME_HOVER | TME_LEAVE;
//		tme.dwHoverTime = 15;
//		tme.hwndTrack = hwnd;
//		_TrackMouseEvent(&tme);
		break;
	}
	case WM_MOUSEHOVER:
	{// red
        hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
		hdc = GetDC(hwnd);
		hdcMem = CreateCompatibleDC(hdc);
		SelectObject(hdcMem, hBitmap);
		BitBlt(hdc, 300, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);     // 11 显示位图  
		ReleaseDC(hwnd,hdcMem);
		ReleaseDC(hwnd,hdc);
		msLast=WM_MOUSEHOVER;
		break;
	}
	case WM_MOUSELEAVE:
	{// green
		hBitmap1 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2));
        hdc = GetDC(hwnd);
        hdcMem = CreateCompatibleDC(hdc); 
        SelectObject(hdcMem, hBitmap1);
        BitBlt(hdc, 300, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);  
        ReleaseDC(hwnd,hdcMem);
        ReleaseDC(hwnd,hdc);
		msLast=WM_MOUSELEAVE;
		break;
	}

注意: case WM_PAINT: 中 画 leave 位图 祝 成功 !
我有点抱歉。。。。 还是出现未初始化的局部变量hInstance和一个出现在LINK的生成代码失败错误,在HDC里给hdc赋值NULL之后错误依然出现,#pragma了COMCTL32.LIB之后依然代码生成失败。。。
a67913463 2020-04-03
  • 打赏
  • 举报
回复
case WM_PAINT: 中 画 leave 位图
schlafenhamster 2020-04-03
  • 打赏
  • 举报
回复
1 增加 一个 static int msLast=WM_MOUSELEAVE;
用来 只 重绘 一次
2 改动

case WM_MOUSEMOVE:
{
if(BmpHitTest(hwnd,lParam)>0)
{
if(msLast==WM_MOUSELEAVE) SendMessage(hwnd,WM_MOUSEHOVER,0,0);
}
else
{
if(msLast==WM_MOUSEHOVER) SendMessage(hwnd,WM_MOUSELEAVE,0,0);
}
// TRACKMOUSEEVENT tme;
// tme.cbSize = sizeof(TRACKMOUSEEVENT);
// tme.dwFlags = TME_HOVER | TME_LEAVE;
// tme.dwHoverTime = 15;
// tme.hwndTrack = hwnd;
// _TrackMouseEvent(&tme);
break;
}
case WM_MOUSEHOVER:
{// red
hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
hdc = GetDC(hwnd);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap);
BitBlt(hdc, 300, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY); // 11 显示位图
ReleaseDC(hwnd,hdcMem);
ReleaseDC(hwnd,hdc);
msLast=WM_MOUSEHOVER;
break;
}
case WM_MOUSELEAVE:
{// green
hBitmap1 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2));
hdc = GetDC(hwnd);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap1);
BitBlt(hdc, 300, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);
ReleaseDC(hwnd,hdcMem);
ReleaseDC(hwnd,hdc);
msLast=WM_MOUSELEAVE;
break;
}


注意:
case WM_PAINT: 中 画 leave 位图

祝 成功 !
qwqwqw408 2020-04-03
  • 打赏
  • 举报
回复
可以使用自定义window类实现,相当于自定义控件,每个控件都有对应的处理方法,我们做的产品就是这么做的,虽然是wince的系统,但是gdi和window这块是通用的
schlafenhamster 2020-04-03
  • 打赏
  • 举报
回复
#include <commctrl.h> // link 中 加入 COMCTL32.LIB
case WM_MOUSEMOVE: 可能要改, 你注意我的回答 !
schlafenhamster 2020-04-03
  • 打赏
  • 举报
回复
合并到 paint 的代码 如下::
1 case WM_CREATE:
中 初始化 2个 位图
//
hInstance = ((LPCREATESTRUCT)lParam)->hInstance; // 3
// green = leave
hBitmap1 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2)); // 4
// red = hover
hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); // 4
// same w h
GetObject(hBitmap1, sizeof(BITMAP), &bitmap); // 5
bmWidth = bitmap.bmWidth; // 6
bmHeight = bitmap.bmHeight;
2 增加 一个 变量
static HBITMAP hBitmap;
static HBITMAP hBitmap1;
static RECT bmrc;// 位图 位置
3 初始化
bmWidth = bitmap.bmWidth; // 6
bmHeight = bitmap.bmHeight;
bmrc.left=300;
bmrc.top=5;
bmrc.right=bmrc.left+bmWidth;
bmrc.bottom=bmrc.top+bmHeight;
4 pait 根据 msLast 决定 位图
case WM_PAINT:// leave
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
if(msLast==WM_MOUSELEAVE)
SelectObject(hdcMem, hBitmap1); // green
else
SelectObject(hdcMem, hBitmap); // red
BitBlt(hdc, 300, 5, bmWidth, bmHeight, hdcMem, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
break;
5 点击 响应
case WM_MOUSEHOVER:
{// red
InvalidateRect(hwnd,&bmrc,true);
msLast=WM_MOUSEHOVER;
break;
}
case WM_MOUSELEAVE:
{// green
InvalidateRect(hwnd,&bmrc,true);
msLast=WM_MOUSELEAVE;
break;
}

  • 打赏
  • 举报
回复
引用 30 楼 pcbmlm 的回复:
试试看百度一下呢
FA♂Q!
pcbmlm 2020-04-03
  • 打赏
  • 举报
回复
试试看百度一下呢
  • 打赏
  • 举报
回复
嗯,现在实现关闭和最小化了,但是每次增加一个按钮都要再绘图和声明一次,这样代码非常杂乱,有什么其他的好办法吗
加载更多回复(19)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧