MFC inherit class

beonit의 이미지

CBitmapButton class를 상속 받아서 CMyBitmap을 만들었습니다.
CBitmapButton은 상태가 변화되면서 다른 그림을 그릴 때, 배경을 흰색으로 다시 칠하게 됩니다. 이게 자주 일어나면 흰색으로 깜빡거리기도 하죠.
그 깜빡임을 그걸 없애고자 클래스를 상속받아 CtlColor을 오버라이딩해서 브러시를 투명 브러시로 바꾸어 줬습니다. 코드는 아래에 있습니다. 이 컨트롤이 그림을 그리는 것에는 문제가 없습니다.

문제는 이 컨트롤의 키 이벤트를 소유하는 윈도우가 받지 못한다는 것 입니다. 클릭 이벤트는 받을 수 있으나, 컨트롤에 포커스가 있을 때의 키 이벤트는 소유하는 윈도우의 PreTranslateMessage 함수에 전달이 되지 않습니다.(반면 그냥 버튼이나 비트맵 버튼은 정상동작합니다.)

왜 그럴까요?
소유 다이얼로그의 ClipSibling, ClipChild 에 문제가 있는 걸까요? 둘다 true로 되어 있길래 둘다 false로 바꿔서 테스트해보니 그것도 마찬가지 였습니다. 혹시 제대로 속성이 먹히지 않은건가요? 그렇다면 다이얼로그에 ClipSibling, ClipChild 속성을 주는 방법은 무엇이 있을까요? 아니면 다른 문제인가요?

도움 부탁드립니다.

클래스 헤더

#pragma once
 
// CMBitmapButton
 
class CMBitmapButton : public CBitmapButton
{
	DECLARE_DYNAMIC(CMBitmapButton)
private:
	CBrush	m_Brush;
public:
	CMBitmapButton();
	virtual ~CMBitmapButton();
 
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
};

구현

// MBitmapButton.cpp : implementation file
//
 
#include "stdafx.h"
#include "MBitmapButton.h"
 
 
// CMBitmapButton
 
IMPLEMENT_DYNAMIC(CMBitmapButton, CBitmapButton)
 
CMBitmapButton::CMBitmapButton()
{
	::CBitmapButton();
}
 
CMBitmapButton::~CMBitmapButton()
{
}
 
 
BEGIN_MESSAGE_MAP(CMBitmapButton, CBitmapButton)
	ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
 
// CMBitmapButton message handlers
 
 
HBRUSH CMBitmapButton::CtlColor(CDC* pDC, UINT nCtlColor){
	m_Brush.DeleteObject();
 
	m_Brush.CreateStockObject(HOLLOW_BRUSH);
	pDC->SetBkMode(TRANSPARENT);
 
	return (HBRUSH)m_Brush;
}
hyunya77의 이미지

www.devpia.com 비사모마을에서 질문하면 10분내로 뭔가 답글이 달릴듯..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.