Winapi 具有位图背景和视觉样式的基于Win32对话框的无边框窗口

Winapi 具有位图背景和视觉样式的基于Win32对话框的无边框窗口,winapi,bitmap,dialogbasedapp,Winapi,Bitmap,Dialogbasedapp,我是新来的,所以请原谅我在帖子上犯的任何愚蠢的错误 使用Win32 API(无MFC)和基于对话框的应用程序创建具有位图背景的无边界窗口时,我遇到了一个问题。我正在使用VisualStudio2010 只有在使用windows XP视觉样式时,通过将公共控件库与以下代码段链接,才会出现此问题: #pragma comment(linker, \ "\"/manifestdependency:type='Win32' "\ "name='Microsoft.Windows.Common

我是新来的,所以请原谅我在帖子上犯的任何愚蠢的错误

使用Win32 API(无MFC)和基于对话框的应用程序创建具有位图背景的无边界窗口时,我遇到了一个问题。我正在使用VisualStudio2010

只有在使用windows XP视觉样式时,通过将公共控件库与以下代码段链接,才会出现此问题:

  #pragma comment(linker, \
  "\"/manifestdependency:type='Win32' "\
  "name='Microsoft.Windows.Common-Controls' "\
  "version='6.0.0.0' "\
  "processorArchitecture='*' "\
  "publicKeyToken='6595b64144ccf1df' "\
  "language='*'\"")
我有一个简单的对话框,里面有一个PictureControl和一个位图图像,这将是窗口的背景。我希望此图像填充整个窗口,无需调整大小或拖放,因此我将其放在屏幕中央,并在我的RC文件中定义对话框和图片控件尺寸相同,如下所示(两个尺寸均为356210):

现在的问题是,当我使用视觉样式时,图像不会填充对话框窗口的整个区域。在对话框的两侧都可以看到一个小的空白(如果删除SS_CENTERIMAGE,则右侧为空白)。如果没有视觉样式,这是不会发生的。下面的图片显示了问题所在(这里使用的图像只是一个示例,实际的背景图像更复杂,因此不能仅使用画笔进行绘制)

没有视觉样式

具有视觉样式

很抱歉链接,仍然没有足够的声誉来发布图片

关于如何使位图在启用视觉样式的情况下填充整个窗口,有什么建议吗?
我找到了melak47关于制作无边界窗口的好答案,但它不是基于对话框的。如果其他方法都不起作用,我想我将不得不采用这种解决方案。

不要使用图片控件。直接在对话框上绘制:

BOOL CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
    HDC hdc;
    RECT rt;

    switch (message){
        case WM_PAINT:
            GetWindowRect(hDlg, &rt);
            hdc = GetWindowDC(hDlg);
            StretchBlt(hdc, 0, 0, rt.right, rt.bottom, hdcMemBitmap, 0, 0, width, height, SRCCOPY);
            ReleaseDc(hDlg, hdc);
            break;
        default:   //for messages that we don't deal with
            return false;
    }

    return false;
}
宽度
高度
用于
位图的宽度和高度


valter

在做了大量的工作之后,我通过在.RC代码中简单地定义图像尺寸来实现它,比VisualStudio对话框编辑器允许的要少一点


通过使用编辑器,如果我将窗口边缘一直拉到图像宽度,或者如果我将“Real Size image”属性设置为true,则编辑器会生成尺寸(356210),启用视觉样式时会留下空白。我只是手动将宽度从356调低到353,空白消失了!因此,当启用视觉样式时,只是Visual Studio编辑器计算了错误的尺寸。

您想要一个模态对话框还是非模态对话框?您好@valter,如果您所说的模态是用户必须单击按钮才能继续,那么它将是非模态的。我用下面的代码创建它:HWND hDlg;hDlg=CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_DIALOG_MAIN),0,DialogProc,0);ShowWindow(hDlg、nCmdShow);非常感谢您的建议@valter!它确实工作正常,但我对这个解决方案还是不够满意,所以我又花了一些时间,找到了一种解决方法,只需更改资源文件。我稍后会发布答案,因为我没有足够的声誉在不到8小时内回答我自己的问题。
BOOL CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
    HDC hdc;
    RECT rt;

    switch (message){
        case WM_PAINT:
            GetWindowRect(hDlg, &rt);
            hdc = GetWindowDC(hDlg);
            StretchBlt(hdc, 0, 0, rt.right, rt.bottom, hdcMemBitmap, 0, 0, width, height, SRCCOPY);
            ReleaseDc(hDlg, hdc);
            break;
        default:   //for messages that we don't deal with
            return false;
    }

    return false;
}