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

时间:2014-02-21 17:02:22

标签: winapi bitmap dialogbasedapp

我是StackOverflow的新手,请原谅我在帖子上犯的任何愚蠢错误。

使用Win32 API(无MFC)和基于对话框的应用程序创建一个带位图背景的无边框窗口时遇到问题。我正在使用visual studio 2010。

只有在使用Windows XP Visual Styles时才会出现问题,方法是将公共控件lib与以下代码段链接起来:

  #pragma comment(linker, \
  "\"/manifestdependency:type='Win32' "\
  "name='Microsoft.Windows.Common-Controls' "\
  "version='6.0.0.0' "\
  "processorArchitecture='*' "\
  "publicKeyToken='6595b64144ccf1df' "\
  "language='*'\"")

我有一个简单的对话框,里面有一个带有位图图像的PictureControl,它将是窗口的背景。我希望这个图像填满整个窗口,不需要调整大小或拖放,所以我只是将它放在屏幕中心并定义对话框和优化校准尺寸在我的RC文件中是相同的,如下所示(两者的尺寸为356,210):

//Main Dialog
IDD_DIALOG_MAIN DIALOGEX 0, 0, 356, 210
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    //Picture Control
    CONTROL         103,IDC_PB_SPLASH,"Static",SS_BITMAP | SS_CENTERIMAGE | SS_REALSIZEIMAGE,0,0,356,210
    DEFPUSHBUTTON   "OK",IDOK,152,169,50,14
END

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

没有视觉样式 http://postimg.org/image/hji8sa6j1/

使用视觉样式 http://postimg.org/image/b733ig3gt/

对于这些链接感到抱歉,仍然没有足够的声誉来发布图片。

有关如何使位图填充整个窗口并启用视觉样式的任何建议? 我发现melak47给出了一个很好的答案https://stackoverflow.com/a/17713810/3022281来创建一个无边界窗口,但它不是基于对话框的。如果没有其他工作,我想我将不得不采用该解决方案。

2 个答案:

答案 0 :(得分:3)

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

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;
}

widthheight适用于bitmaps width and height

瓦尔特

答案 1 :(得分:2)

经过大量的讨论之后,我通过简单地将.RC代码中的图像尺寸定义为比Visual Studio Dialog编辑器允许的更少来实现它。

通过使用编辑器,如果我将Window Edges一直拉到图像宽度,或者如果我将“Real Size Image”属性设置为true,则编辑器会出现尺寸(356,210),这是启用视觉样式时保留空白区域。我只是手动调整了从356到353的宽度,白色空间消失了!因此,只有Visual Studio Editor计算启用视觉样式时的尺寸错误。