【问题标题】:how to stretch a background image in win32 using visual studio c如何使用visual studio c在win32中拉伸背景图像
【发布时间】:2013-01-02 14:44:56
【问题描述】:

我正在尝试使用 c++ 在 Win32 api 中创建一个应用程序,我想让它成为没有任何栏的全屏,我成功了,但我的背景图像仍然存在问题。图像重复,但我希望它被拉伸。你有什么想法吗? 以下部分来自代码:

int WINAPI WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance,
LPSTR lignesDeCommande, int modeDAffichage)
{
HWND fenetrePrincipale;
MSG message;
WNDCLASS classeFenetre;

instance = cetteInstance;


classeFenetre.style = 0;
classeFenetre.lpfnWndProc = procedureFenetrePrincipale;
classeFenetre.cbClsExtra = 0;
classeFenetre.cbWndExtra = 0;
classeFenetre.hInstance = NULL;
classeFenetre.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
   // classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
//classeFenetre.hbrBackground = CreatePatternBrush(LoadBitmap( instance, MAKEINTRESOURCE("images\Image1.bmp" ) ) );
HBITMAP hbmp = LoadBitmap(instance,MAKEINTRESOURCE(IDB_BITMAP1));
    if(NULL == hbmp)
    {
        MessageBox(NULL,L"BitMap Loading Failed.",L"Error",MB_ICONEXCLAMATION | MB_OK);
    }
    else
    {
        HBRUSH hbr = CreatePatternBrush(hbmp);
        if(NULL == hbr)
        {
            MessageBox(NULL,L"Brush Creation Failed.",L"Error",MB_ICONEXCLAMATION | MB_OK);
        }
        else
        {
            //StretchBlt();
            HDC hdcMem = GetDC (NULL) ;
            HDC wndHDC = GetDC (fenetrePrincipale) ;
            StretchBlt(hdcMem, 0, 0, 800, 600, wndHDC, 0, 0, 1280, 1024, SRCCOPY);
            classeFenetre.hbrBackground = hbr ;



        }
    }
classeFenetre.lpszMenuName = NULL;
classeFenetre.lpszClassName = L"classeF";

//fullscreen mode and delete minimize and max buttons


// On prévoit quand même le cas où ça échoue
if(!RegisterClass(&classeFenetre)) return FALSE;
//WS_OVERLAPPEDWINDOW
    fenetrePrincipale = CreateWindow(L"classeF", L"Ma premiere fenetre winAPI !",WS_MAXIMIZE|WS_POPUP ,
                               CW_USEDEFAULT, CW_USEDEFAULT, 800, 630,
                                               NULL,
                                               NULL,//LoadMenu(instance, L"ID_MENU"),
                                               cetteInstance,
                                               NULL);
if (!fenetrePrincipale) return FALSE;

//ShowWindow(fenetrePrincipale, modeDAffichage);

ShowWindow(fenetrePrincipale,SW_MAXIMIZE);
UpdateWindow(fenetrePrincipale);


while (GetMessage(&message, NULL, 0, 0))
{
    TranslateMessage(&message);
    DispatchMessage(&message);
}
return message.wParam;

}

谢谢

【问题讨论】:

    标签: c++ windows visual-studio winapi visual-c++


    【解决方案1】:

    您没有显示确切的代码,但您似乎加载了一个位图,从中创建了一个画笔,然后将该画笔设置为您的窗口的画笔。画笔确实会导致您报告的重复图像行为。要获得拉伸位图,您可以跳过任何与画笔相关的代码。相反,处理发送到您的窗口的WM_ERASEBKGND 消息。在其中,调用StretchBlt 将位图绘制到窗口的客户区。要绘制的HDC 在消息的wParam 参数中给出。

    【讨论】:

    • 我已经添加了我的完整代码,我是win32的新手,不太理解你的回复
    • 您的问题方式超出了本问题的范围。您需要学习如何设置窗口过程以及如何处理消息。我没有能力为所有这些提供样本。
    • 只是一个精度,我认为我不需要处理任何消息,因为我希望从主函数的开头提取背景图像。如果我错了,请纠正我!
    • @Amine,您可以在将图像转换为画笔之前调整图像大小,但是按照此处的建议响应 WM_ERASEBKGND 消息要容易得多。如果不响应消息,就不可能进行正确的 Windows 编程。
    • @mark 我终于成功使用 wm_erasebkgnd 但图像隐藏了我的按钮并且无法覆盖最多 10 个像素
    【解决方案2】:

    步骤 1、CreateWindowEx创建窗口

    2、SetWindowPos 将你的窗口放置在所有窗口和全屏之上

    3、在你的windows的WindowProce上处理WM_PAINT消息

    4、加载你的位图

    5、使用CreateCompatibleDC创建内存dc

    6、通过调用 SelectObject 将位图放入内存 dc

    7、对你的实际dc做StretchBlt,使用准备好的内存dc作为源,你应该知道位图的实际宽度和高度才能正确拉伸

    【讨论】:

    • 感谢托尼,但如果我不想在不输入目标图像大小的情况下拉伸它,因为它会改变
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    相关资源
    最近更新 更多