안녕하세요~~~~
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 될때 약간의 문제가 있는데 이부분은 수정해서 요청이 있을때 다시 올리겠습니다.
|
수정된것 기대하고 있습니다.