2

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

我在使用 Win32 API(无 MFC)和基于对话框的应用程序创建具有位图背景的无边框窗口时遇到问题。我正在使用视觉工作室 2010。

只有当我使用 Windows XP 视觉样式时,才会出现此问题,方法是将公共控件库与以下代码段链接:

  #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/

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

关于如何使位图在启用视觉样式的情况下填充整个窗口的任何建议?我找到了这个很好的答案https://stackoverflow.com/a/17713810/3022281 by melak47 来制作一个无边框窗口,但它不是基于对话框的。如果没有其他办法,我想我将不得不采用该解决方案。

4

2 回答 2

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

width并且height是为bitmaps width and height.

瓦尔特

于 2014-02-21T18:45:53.203 回答
2

经过一番大惊小怪后,我通过简单地在 .RC 代码中定义图像尺寸来使其工作,比 Visual Studio 对话框编辑器允许的要少一些。

通过使用编辑器,如果我将 Window Edges 一直拉到图像宽度,或者如果我将“Real Size Image”属性设置为 true,则编辑器会得出尺寸 (356,210),它会留下白色启用视觉样式时的空间。我只是手动将宽度从 356 调到 353,然后空白就消失了!所以只是 Visual Studio 编辑器在启用视觉样式时计算错误的尺寸。

于 2014-02-22T01:42:43.880 回答