C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[739] 투명 ComboBox 만들기
홍창희 [hchee76] 8038 읽음    2008-02-15 19:16
안녕하세요~~~~

BCB를 시작한지 얼마 안되는 초보입니다.
MFC만 하다가 갑자기 BCB로 되어 있는 프로젝트의 유지 보수를 하게 됐는데
한번도 해본적도 없고 책도 없고 컴포넌트를 생성 할줄도 몰랐던 제가
오로지 이 빌더 포럼과 구글만을 의지해서 컴포넌트를 만들게 되었습니다.

너무 많은 도움을 받아서 보답의 의미로 제가 만든 ComboBox 컴포넌트를 하나 소개 해볼까 합니다.
초보가 만든 것이니 크게 기대는 하지 마세요 ^^;;;;

헤더 입니다.
//---------------------------------------------------------------------------

#ifndef HCHComboBoxH
#define HCHComboBoxH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>

#define WS_EX_LAYERED     0x00080000

#define ALPAHBLEND_VALUE    100
typedef BOOL (WINAPI *FP_SLWA)(HWND, COLORREF, BYTE, DWORD);
//---------------------------------------------------------------------------
class PACKAGE THCHComboBox : public TComboBox
{
private:
protected:
    virtual void __fastcall CreateParams(Controls::TCreateParams &Params);
    void __fastcall WndProc(Messages::TMessage &Message);
public:
    __fastcall THCHComboBox(TComponent* Owner);
    __fastcall virtual ~THCHComboBox();


    void __fastcall SetLayeredStyle(void * listHandle);
    FP_SLWA __fastcall Get_SetLayeredWindowAttributes_Pointer();
__published:
};
//---------------------------------------------------------------------------
#endif

다음은 cpp 입니다.
//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "HCHComboBox.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(THCHComboBox *)
{
    new THCHComboBox(NULL);
}
//---------------------------------------------------------------------------
__fastcall THCHComboBox::THCHComboBox(TComponent* Owner)
    : TComboBox(Owner)
{
}
//---------------------------------------------------------------------------
namespace Hchcombobox
{
    void __fastcall PACKAGE Register()
    {
         TComponentClass classes[1] = {__classid(THCHComboBox)};
         RegisterComponents("Samples", classes, 0);
    }
}
//---------------------------------------------------------------------------
__fastcall THCHComboBox::~THCHComboBox()
{

}

FP_SLWA  __fastcall THCHComboBox::Get_SetLayeredWindowAttributes_Pointer()
{
    HMODULE h_user32_dll = GetModuleHandle("USER32.DLL");
    if(h_user32_dll != NULL){
        return (FP_SLWA)GetProcAddress(h_user32_dll, "SetLayeredWindowAttributes");
    }

    return NULL;
}

void __fastcall THCHComboBox::SetLayeredStyle(void * listHandle)
{

    int window_style = GetWindowLong(listHandle, GWL_EXSTYLE);

    if(!(window_style & WS_EX_LAYERED)){
        SetWindowLong(listHandle, GWL_EXSTYLE, window_style | WS_EX_LAYERED);
    }
}

void __fastcall THCHComboBox::CreateParams(Controls::TCreateParams &Params)
{
  TComboBox::CreateParams(Params);
  Params.Style |= CBS_DROPDOWNLIST;
}

void __fastcall THCHComboBox::WndProc(TMessage &Message)
{

    if( Message.Msg == WM_CTLCOLORLISTBOX || Message.Msg == CN_CTLCOLORLISTBOX )
    {
        HWND listHandle = (HWND)Message.LParam;

        SetLayeredStyle(listHandle);

        FP_SLWA fp_set_layered_window_attributes = Get_SetLayeredWindowAttributes_Pointer();
        if(fp_set_layered_window_attributes != NULL)
        {
            // 함수의 포인터를 이용해서 SetLayeredWindowAttributes 함수를 간접 수행한다.
            (*fp_set_layered_window_attributes)( listHandle, 0, ALPAHBLEND_VALUE, LWA_ALPHA);
        }
   }
   TComboBox::WndProc(Message);
}

처음 DropDown 될때 약간의 문제가 있는데 이부분은 수정해서 요청이 있을때 다시 올리겠습니다.
장성호 [nasilso]   2008-02-20 10:20 X
맨처음 DropDown 할때 제대로 안나오네요
수정된것 기대하고 있습니다.

+ -

관련 글 리스트
739 투명 ComboBox 만들기 홍창희 8038 2008/02/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.