读书人

关于stretchblt按钮贴图有关问题

发布时间: 2012-04-04 16:38:51 作者: rapoo

关于stretchblt按钮贴图问题
为什么用stretchblt贴上去的图显示不出来,我是个新手,有哪位高人可以指出下哪出问题了么,这问题困扰我很久了
谢谢



#include "resource.h"
#include <windows.h>
#include <cstdio>
HINSTANCE hlnst;
INT_PTR CALLBACK dlgproc(HWND hdlg,UINT umsg,WPARAM wparam,LPARAM lparam);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
MSG msg;
hlnst=hInstance;
HWND hdlgnd=CreateDialog(hInstance,(LPCSTR)IDD_MAINDIALOG,NULL,(DLGPROC)dlgproc);
ShowWindow(hdlgnd,nShowCmd);
UpdateWindow(hdlgnd);

while (GetMessage(&msg,0,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

INT_PTR CALLBACK dlgproc(HWND hdlg,UINT umsg,WPARAM wparam,LPARAM lparam)
{
HBITMAP hbit;
BITMAP bitinfo;
RECT recbtn;
HDC hdcbtn;
HDC hdcsue;
LPDRAWITEMSTRUCT lpd;
switch (umsg)
{
case WM_INITDIALOG:
hbit=LoadBitmap(hlnst,MAKEINTRESOURCE(IDB_BIT));
GetObject(hbit,sizeof(BITMAP),&bitinfo);
break;


case WM_DRAWITEM:
lpd=(LPDRAWITEMSTRUCT)lparam;
hdcbtn=lpd->hDC;
recbtn=lpd->rcItem;
hdcsue=CreateCompatibleDC(hdcbtn);

if (lpd->CtlID==IDB_DRAW)
{
StretchBlt(hdcbtn,0,0,(recbtn.right-recbtn.left),
(recbtn.top-recbtn.bottom),hdcsue,0,0,
bitinfo.bmWidth,bitinfo.bmHeight,SRCCOPY);
}

if (lpd->CtlID==IDB_BTN)
{
FillRect(hdcbtn,&recbtn,CreateSolidBrush(RGB(12,145,214)));

}
break;



case WM_CLOSE:
DestroyWindow(hdlg);
break;

case WM_DESTROY:
PostQuitMessage(0);
break;
}


return FALSE;
}

[解决办法]
你的IDB_DRAW和IDB_BTN关联的Button控件勾上Owner draw属性

C/C++ code
#include "stdafx.h"#include "resource.h"#include <windows.h>#include <stdio.h>HINSTANCE hlnst;INT_PTR CALLBACK dlgproc(HWND hdlg,UINT umsg,WPARAM wparam,LPARAM lparam);int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){    MSG msg;    hlnst=hInstance;    HWND hdlgnd=CreateDialog(hInstance,(LPCSTR)IDD_MAINDIALOG,NULL,(DLGPROC)dlgproc);    ShowWindow(hdlgnd,nShowCmd);    UpdateWindow(hdlgnd);        while (GetMessage(&msg,0,0,0))    {        TranslateMessage(&msg);        DispatchMessage(&msg);    }    return 0;}INT_PTR CALLBACK dlgproc(HWND hdlg,UINT umsg,WPARAM wparam,LPARAM lparam){    static HBITMAP hbit;    static BITMAP bitinfo;    RECT recbtn;    HDC hdcbtn;    HDC hdcsue;    LPDRAWITEMSTRUCT lpd;    HBITMAP hold;    switch (umsg)    {    case WM_INITDIALOG:        hbit=LoadBitmap(hlnst,MAKEINTRESOURCE(IDB_BIT));        GetObject(hbit,sizeof(BITMAP),&bitinfo);        break;                    case WM_DRAWITEM:        lpd=(LPDRAWITEMSTRUCT)lparam;        hdcbtn=lpd->hDC;        recbtn=lpd->rcItem;        hdcsue=CreateCompatibleDC(hdcbtn);        hold = (HBITMAP)SelectObject(hdcsue, hbit);                if (lpd->CtlID==IDB_DRAW)        {            StretchBlt(hdcbtn,0,0,(recbtn.right-recbtn.left),                (recbtn.bottom-recbtn.top),hdcsue,0,0,                bitinfo.bmWidth,bitinfo.bmHeight,SRCCOPY);        }                if (lpd->CtlID==IDB_BTN)        {            FillRect(hdcbtn,&recbtn,CreateSolidBrush(RGB(12,145,214)));                }        SelectObject(hdcsue, hold);        DeleteDC(hdcsue);        break;    case WM_CLOSE:        DestroyWindow(hdlg);        break;            case WM_DESTROY:        PostQuitMessage(0);        break;    }            return FALSE;} 

读书人网 >C++

热点推荐