Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用win32api c+绘制图标+;_C++_Winapi - Fatal编程技术网

C++ 用win32api c+绘制图标+;

C++ 用win32api c+绘制图标+;,c++,winapi,C++,Winapi,我正试图用win32 api在我的窗口上绘制一个图标。这里是我加载图像的地方 case WM_CREATE: { HANDLE image = (HICON)LoadImage(NULL, TEXT("Button.ico"), IMAGE_ICON, 16, 16, LR_LOADFROMFILE | LR_LOADTRANSPARENT); break; } 这里是我尝试在屏幕上绘制图标的地方 case WM_NCPAINT: {

我正试图用win32 api在我的窗口上绘制一个图标。这里是我加载图像的地方

case WM_CREATE: {
        HANDLE image = (HICON)LoadImage(NULL, TEXT("Button.ico"), IMAGE_ICON, 16, 16, LR_LOADFROMFILE | LR_LOADTRANSPARENT);
break;
}
这里是我尝试在屏幕上绘制图标的地方

    case WM_NCPAINT: {
        PAINTSTRUCT ps;
        BITMAP bm;
        HDC hdc = BeginPaint(ParentHwnd, &ps);
        HDC hdcMem = CreateCompatibleDC(hdc);
        HBITMAP hbmOld = SelectObject(hdcMem, image);

        GetObject(image, sizeof(bm), &bm);

        BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

        SelectObject(hdcMem, hbmOld);
        DeleteDC(hdcMem);
        EndPaint(ParentHwnd, &ps);
        break;
    }
由于某种原因,我在SelectObject()上遇到了这个错误


我正在使用VisualStudioCommunity2019。我到处找了找答案。提前感谢您的帮助。

首先,您不应该在
WM\u NCPAINT
处理程序中使用
BeginPaint()
,只能在
WM\u PAINT
处理程序中使用。根据,请改用

第二,您可能已经打开了(这是一件好事),这就是为什么会出现编译器错误。在
STRICT
下,不能将
HGDIOBJ
(aka
void*
)分配给
HBITMAP
(aka
struct HBITMAP\uuu*
),因此需要显式键入cast
SelectObject()的返回值。但是,您正在加载一个
HICON
,无法按原样选择它到
HDC
,因此您必须:

  • 加载BMP文件而不是ICO文件
  • HICON
    数据转换为实际的
    HBITMAP
  • 使用或
第三,在
WM\u CREATE
处理程序中,
image
变量是该消息处理程序的本地变量,因此在
WM\u NCPAINT
处理程序中访问的任何
image
都不是同一个变量

请尝试以下方法:

HBITMAP图像;
...
案例WM_创建:{
HICON图标=(HICON)加载图像(空,文本(“Button.ico”),图像图标,16,16,LR_LOADFROMFILE | LR_LOADTRANSPARENT);
//根据需要将图标转换为图像。。。
破坏图标(图标);
打破
}
案例WM_NCPAINT:{
位图bm;
HDC HDC=GetDCEx(hwnd,(HRGN)wParam,DCX_WINDOW | DCX_INTERSECTRGN);
HDC hdcMem=CreateCompatibleDC(HDC);
HBITMAP hbmOld=(HBITMAP)选择对象(hdcMem,图像);
获取对象(图像、大小(bm)和大小(bm);
BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,srcopy);
选择对象(hdcMem、hbmOld);
DeleteDC(hdcMem);
释放DC(hwnd、hdc);
打破
}
或者这个:

HICON图像;
...
案例WM_创建:{
image=(HICON)LoadImage(NULL,文本(“Button.ico”),image_图标,16,16,LR_LOADFROMFILE | LR_LOADTRANSPARENT);
打破
}
案例WM_销毁:{
破坏图标(图像);
打破
}
案例WM_NCPAINT:{
HDC HDC=GetDCEx(hwnd,(HRGN)wParam,DCX_WINDOW | DCX_INTERSECTRGN);
绘图图标(hdc,0,0,图像);
释放DC(hwnd、hdc);
打破
}

您可以通过消息将图标加载到静态控件中。否则,我认为您至少需要将
WM\u-NCPAINT
替换为
WM\u-PAINT
WM\u NCPAINT
消息用于高级使用。此外,您不检查加载图像是否成功。您应该将HGDIOBJ强制转换为HBITMAP。然而,这并不是你的主要问题。图标很简单,你只需调用DrawIcon。不需要所有的环,你必须跳过绘制位图。非常感谢大家。我的问题解决了。谢谢,我完全没有意识到DrawIcon()的存在。
E0144 a value of type "HGDIOBJ" cannot be used to initialize an entity of type "HBITMAP"