원본:
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=7771&page=1
빌더 버전으로 바꾼 것입니다.
원리는 간단합니다.
메시지박스 윈도를 만들고 화면에 보여주기 직전에 버턴의 캡션을 수정하는 것입니다.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
HHOOK g_hMessageBoxHook;
int CALLBACK HookWndProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
HWND hChildWnd;
if (nCode == HCBT_ACTIVATE)
{
hChildWnd = (HWND)wParam;
if (::GetDlgItem(hChildWnd,IDOK) != NULL)
::SetDlgItemText(hChildWnd, IDOK, "확인 OK");
if (::GetDlgItem(hChildWnd,IDYES) != NULL)
::SetDlgItemText(hChildWnd, IDYES, "Change_YES");
if (::GetDlgItem(hChildWnd,IDNO) != NULL)
::SetDlgItemText(hChildWnd, IDNO, "Change_NO");
// 훅 해제
UnhookWindowsHookEx(g_hMessageBoxHook);
}
else
CallNextHookEx(g_hMessageBoxHook, nCode, wParam, lParam);
return 0;
}
UINT TForm1::MyMessageBox(HWND hWnd, char* szText, UINT nType)
{
// 훅설정
g_hMessageBoxHook = SetWindowsHookEx(WH_CBT, (int (__stdcall *)())&HookWndProc, 0, GetCurrentThreadId());
// 메시지 박스 호출
return MessageBox(hWnd, szText, "알림", nType);
}
//---------------------------------------------------------------------------
// Test
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MyMessageBox(0, "MessageBox 테스트입니다.", MB_OK | MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------