2013-11-24 1 views
0

구현의 서브 클래 싱으로 버튼의 배경을 바꾸기 위해 모든 소스를 시도했다.나는 그에게 배경을 바꿀 때 버튼의 기능을 잃는다.

배경을 바꿀 때 사각형 모양이 생기고 그것을 클릭 할 수 없습니다. 누군가가 좋은 자습서 나 코드 샘플을 공유 할 수 있습니까? 어쨌든

, 이 내 코드입니다 :

LRESULT CALLBACK DrawPushButton(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
HDC   hdcMem; 
HBITMAP  hbmMem; 
HANDLE  hnd; 
PAINTSTRUCT ps; 
HDC   hdc; 

int win_width=100; 
int win_height=50; 
    switch(uMsg) 
    { 
    case WM_PAINT: 
     hdc = BeginPaint(hwnd, &ps); 

     hdcMem = CreateCompatibleDC(hdc); 
     hbmMem = CreateCompatibleBitmap(hdc, win_width, win_height); 
     hnd = SelectObject(hdcMem, hbmMem); 
     BitBlt(hdc, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY); 
     EndPaint(hwnd, &ps); 
     return 0; 
     break; 
    } 
    return CallWindowProc (OldWndProc, hwnd, uMsg, wParam, lParam); 
} 

편집 : 내가 버튼에 BS_OWNERDRAW 창 스타일을 추가 :

HWND hWndButton=CreateWindowEx(NULL,L"BUTTON",L"OK",WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON|BS_OWNERDRAW,50,220,100,24,hWnd,(HMENU)IDC_MAIN_BUTTON,GetModuleHandle(NULL),NULL); 

그리고 난 콜백을 변경하지만, WM_DRAWITEM하지 않았다 전화 :

LRESULT CALLBACK DrawPushButton(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
    case WM_DRAWITEM: 
      HDC hdc = GetDC(hwnd); 
      TextOut(hdc,0,0,L"itay",4); 
     break; 
    } 
    return 0; 
} 
+1

사용자 정의 버튼을 그리려면, 당신은 그것에게'BS_OWNERDRAW' 창 스타일을 제공하고'WM_DRAWITEM' 메시지를 처리해야합니다. –

+0

버튼을 칠할 때마다 * 만들고있는 DC 및 비트 맵을 삭제해야한다고 생각하지 않습니까? –

+0

@RemyLebeau BS_OWNERDRAW를 추가했지만 프로그램을 디버깅 할 때 WM_DRAWITEM이 호출하지 않았습니다. 위의 내 의견을 참조하십시오. –

답변

0

'좋은'코드는 아닙니다. 그것은 기능입니다 - 아마도 언급 한 바와 같이 BS_OWNERDRAW 스타일을 사용하고 버튼이 포함 된 대화 상자/윈도우의 wndproc에서 드로잉을 처리해야합니다. 나는 당신이 가지고있는 것과 같은 방식으로 그것을 접근 한 예를 붙이기로했습니다. 당신은 그림의 모두해야합니다. 그러나 WM_TIMER 메시지에 응답 할 수있는 기회가 있습니다. (대화 상자/창 WindowProc에서만 그리기를 할 수 있다면 그렇게 할 기회가 있는지 확실하지 않음)

나는 또한 단순화를 위해 대신하는 하위 분류 방법을 사용하도록 선택했습니다. 일반 컨트롤의 버전 6, 당신은 대신 (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762102(v=vs.85).aspx)

MAIN.CPP

#include <windows.h> 
#include <commctrl.h> 
#include <stdio.h> 
#include "resource.h" 

HINSTANCE hInst; 

LRESULT CALLBACK btnProc(HWND btnWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    long oldWndProc; 
    int i; 
    oldWndProc = GetWindowLong(btnWnd, GWL_USERDATA); 
    switch (uMsg) 
    { 
     case WM_PAINT: 
      { 
       HDC hdc; 
       PAINTSTRUCT ps; 
       RECT mRect; 
       HBRUSH mBrush; 

       hdc = BeginPaint(btnWnd, &ps); 
       mBrush = CreateSolidBrush(RGB(100, 147, 111)); 
       GetClientRect(btnWnd, &mRect); 
       FillRect(hdc, &mRect, mBrush); 
       DeleteObject(mBrush); 

       EndPaint(btnWnd, &ps); 
      } 
      return 0; 
    } 
    return CallWindowProc((WNDPROC)oldWndProc, btnWnd, uMsg, wParam, lParam); 
} 


void onCommand(HWND hwndDlg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (LOWORD(wParam)) 
    { 
    case IDC_BUTTON1: 
     MessageBeep(MB_ICONEXCLAMATION); 
     break; 
    } 
} 

LRESULT CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
     case WM_INITDIALOG: 
     { 
      HWND btnWnd; 
      long oldBtnProc; 
      btnWnd = GetDlgItem(hwndDlg, IDC_BUTTON1); 
      oldBtnProc = GetWindowLong(btnWnd, GWL_WNDPROC); 
      SetWindowLong(btnWnd, GWL_USERDATA, oldBtnProc); 
      SetWindowLong(btnWnd, GWL_WNDPROC, (long)btnProc); 
     } 
     return TRUE; 

     case WM_CLOSE: 
     { 
      EndDialog(hwndDlg, 0); 
     } 
     return TRUE; 

     case WM_COMMAND: 
      onCommand(hwndDlg, wParam, lParam); 
      return TRUE; 
    } 
    return FALSE; 
} 


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    hInst=hInstance; 
    InitCommonControls(); 
    return DialogBox(hInst, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgMain); 
} 

및 Resource.h

#ifndef IDC_STATIC 
#define IDC_STATIC (-1) 
#endif 

#define DLG_MAIN        100 
#define IDC_BUTTON1        1000 

resource.rc

SetWindowSubclass를 사용해야하기 때문에
// Generated by ResEdit 1.5.11 
// Copyright (C) 2006-2012 
// http://www.resedit.net 

#include <windows.h> 
#include <commctrl.h> 
#include <richedit.h> 
#include "resource.h" 

// 
// Dialog resources 
// 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
DLG_MAIN DIALOG 0, 0, 186, 95 
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU 
CAPTION "Dialog" 
FONT 8, "Ms Shell Dlg" 
{ 
    PUSHBUTTON  "Button1", IDC_BUTTON1, 7, 7, 50, 14 
} 

// 
// Manifest resources 
// 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
1     RT_MANIFEST ".\\manifest.xml" 
01 23,516,

manifest.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> 
    </dependentAssembly> 
    </dependency> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel 
      level="asInvoker" 
      uiAccess="false"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 
관련 문제