You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
935 lines
25 KiB
935 lines
25 KiB
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include "ddbtn.h"
|
|
#include "cddbtn.h"
|
|
#include "exgdiw.h"
|
|
#include "dbg.h"
|
|
|
|
static POSVERSIONINFO GetOSVersion(VOID)
|
|
{
|
|
static BOOL fFirst = TRUE;
|
|
static OSVERSIONINFO os;
|
|
if ( fFirst ) {
|
|
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
if (GetVersionEx( &os ) ) {
|
|
fFirst = FALSE;
|
|
}
|
|
}
|
|
return &os;
|
|
}
|
|
|
|
static BOOL ExIsWinNT(VOID)
|
|
{
|
|
return (GetOSVersion()->dwPlatformId == VER_PLATFORM_WIN32_NT);
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
// <-Spec width>
|
|
// <--> 12 point
|
|
// +--------+--+
|
|
// | | |
|
|
// | | |
|
|
// +--------+--+
|
|
//----------------------------------------------------------------
|
|
#define CXDROPDOWN 12
|
|
#define TIMERID_MONITORPOS 0x0010
|
|
#define WM_USER_COMMAND (WM_USER+400)
|
|
//----------------------------------------------------------------
|
|
//Get, Set LPCDDButton this pointer.
|
|
//this is set to cbWndExtra.
|
|
//See WinRegister()
|
|
//----------------------------------------------------------------
|
|
inline LPCDDButton GetThis(HWND hwnd)
|
|
{
|
|
#ifdef _WIN64
|
|
return (LPCDDButton)GetWindowLongPtr(hwnd, 0);
|
|
#else
|
|
return (LPCDDButton)GetWindowLong(hwnd, 0);
|
|
#endif
|
|
}
|
|
//----------------------------------------------------------------
|
|
inline LPCDDButton SetThis(HWND hwnd, LPCDDButton lpDDB)
|
|
{
|
|
#ifdef _WIN64
|
|
return (LPCDDButton)SetWindowLongPtr(hwnd, 0, (LONG_PTR)lpDDB);
|
|
#else
|
|
return (LPCDDButton)SetWindowLong(hwnd, 0, (LONG)lpDDB);
|
|
#endif
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : WndProc
|
|
// Type : static LRESULT CALLBACK
|
|
// Purpose : Window Procedure for Drop Down Button.
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : UINT uMsg
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE : 970905
|
|
//////////////////////////////////////////////////////////////////
|
|
static LRESULT CALLBACK WndProc(HWND hwnd,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
LPCDDButton lpDDB;
|
|
if(uMsg == WM_CREATE) {
|
|
lpDDB = (LPCDDButton)((LPCREATESTRUCT)lParam)->lpCreateParams;
|
|
if(!lpDDB) {
|
|
return 0; // do not create button
|
|
}
|
|
SetThis(hwnd, lpDDB);
|
|
lpDDB->MsgCreate(hwnd, wParam, lParam);
|
|
return 1;
|
|
}
|
|
|
|
if(uMsg == WM_DESTROY) {
|
|
lpDDB = GetThis(hwnd);
|
|
if(lpDDB) {
|
|
delete lpDDB;
|
|
PrintMemInfo();
|
|
}
|
|
SetThis(hwnd, (LPCDDButton)NULL);
|
|
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
lpDDB = GetThis(hwnd);
|
|
if(!lpDDB) {
|
|
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
switch(uMsg) {
|
|
case WM_PAINT:
|
|
lpDDB->MsgPaint(hwnd, wParam, lParam);
|
|
break;
|
|
case WM_MOUSEMOVE:
|
|
lpDDB->MsgMouseMove(hwnd, wParam, lParam);
|
|
break;
|
|
case WM_TIMER:
|
|
lpDDB->MsgTimer(hwnd, wParam, lParam);
|
|
break;
|
|
case WM_SETFONT:
|
|
return lpDDB->MsgSetFont(hwnd, wParam, lParam);
|
|
case WM_LBUTTONDBLCLK:
|
|
case WM_MBUTTONDBLCLK:
|
|
case WM_RBUTTONDBLCLK:
|
|
case WM_LBUTTONDOWN:
|
|
case WM_MBUTTONDOWN:
|
|
case WM_RBUTTONDOWN:
|
|
lpDDB->MsgButtonDown(hwnd, uMsg, wParam, lParam);
|
|
break;
|
|
case WM_LBUTTONUP:
|
|
case WM_MBUTTONUP:
|
|
case WM_RBUTTONUP:
|
|
lpDDB->MsgButtonUp(hwnd, uMsg, wParam, lParam);
|
|
break;
|
|
case WM_ENABLE:
|
|
lpDDB->MsgEnable(hwnd, wParam, lParam);
|
|
break;
|
|
case WM_COMMAND:
|
|
return lpDDB->MsgCommand(hwnd, wParam, lParam);
|
|
case WM_USER_COMMAND:
|
|
return lpDDB->MsgUserCommand(hwnd, wParam, lParam);
|
|
case WM_EXITMENULOOP:
|
|
lpDDB->MsgExitMenuLoop(hwnd, wParam, lParam);
|
|
break;
|
|
case WM_MEASUREITEM:
|
|
return lpDDB->MsgMeasureItem(hwnd, wParam, lParam);
|
|
case WM_DRAWITEM:
|
|
return lpDDB->MsgDrawItem(hwnd, wParam, lParam);
|
|
case DDBM_ADDITEM: return lpDDB->MsgDDB_AddItem (hwnd, wParam, lParam);
|
|
case DDBM_INSERTITEM: return lpDDB->MsgDDB_InsertItem (hwnd, wParam, lParam);
|
|
case DDBM_SETCURSEL: return lpDDB->MsgDDB_SetCurSel (hwnd, wParam, lParam);
|
|
case DDBM_GETCURSEL: return lpDDB->MsgDDB_GetCurSel (hwnd, wParam, lParam);
|
|
case DDBM_SETICON: return lpDDB->MsgDDB_SetIcon (hwnd, wParam, lParam);
|
|
case DDBM_SETTEXT: return lpDDB->MsgDDB_SetText (hwnd, wParam, lParam);
|
|
case DDBM_SETSTYLE: return lpDDB->MsgDDB_SetStyle (hwnd, wParam, lParam);
|
|
#ifndef UNDER_CE // not support WM_ENTERIDLE
|
|
case WM_ENTERIDLE:
|
|
//----------------------------------------------------------------
|
|
//980818:Bug found in PRC.
|
|
//If Ctrl+Shift is assigned to switch IME,
|
|
//Menu remains in spite of imepad has destroyed.
|
|
//To prevent it, if Ctrl+Shift come while menu is poping up.
|
|
//close it.
|
|
//----------------------------------------------------------------
|
|
{
|
|
if((::GetKeyState(VK_CONTROL) & 0x8000) &&
|
|
(::GetKeyState(VK_SHIFT) & 0x80000)) {
|
|
Dbg(("VK_SHIFT_CONTROL COME\n"));
|
|
::SendMessage(hwnd, WM_CANCELMODE, 0, 0L);
|
|
return 0;
|
|
}
|
|
}
|
|
break;
|
|
#endif // UNDER_CE
|
|
default:
|
|
//Dbg(("Msg [0x%08x]\n", uMsg));
|
|
break;
|
|
}
|
|
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton
|
|
// Type :
|
|
// Purpose : Constructor
|
|
// Args :
|
|
// : HINSTANCE hInst
|
|
// : HWND hwndParent
|
|
// : DWORD dwStyle
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
CDDButton::CDDButton(HINSTANCE hInst, HWND hwndParent, DWORD dwStyle, DWORD wID)
|
|
{
|
|
m_hInst = hInst;
|
|
m_hwndParent = hwndParent;
|
|
m_dwStyle = dwStyle;
|
|
m_wID = wID;
|
|
m_cxDropDown = CXDROPDOWN;
|
|
m_bidDown = BID_UNDEF;
|
|
m_curDDBItemIndex = -1;
|
|
m_fEnable = TRUE;
|
|
|
|
m_f16bitOnNT = FALSE;
|
|
#ifndef UNDER_CE // Windows CE always 32bit application
|
|
if(ExIsWinNT()) {
|
|
char szBuf[256];
|
|
DWORD dwType = 0;
|
|
::GetModuleFileName(NULL, szBuf, sizeof(szBuf));
|
|
::GetBinaryType(szBuf, &dwType);
|
|
if(dwType == SCS_WOW_BINARY) {
|
|
m_f16bitOnNT = TRUE;
|
|
}
|
|
}
|
|
#endif // UNDER_CE
|
|
#ifdef UNDER_CE // Windows CE does not support GetCursorPos
|
|
m_ptEventPoint.x = -1;
|
|
m_ptEventPoint.y = -1;
|
|
#endif // UNDER_CE
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : ~CDDButton
|
|
// Type :
|
|
// Purpose : Destructor
|
|
// Args :
|
|
// :
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
CDDButton::~CDDButton()
|
|
{
|
|
Dbg(("~CDDButton \n"));
|
|
if(m_hIcon) {
|
|
Dbg(("DestroyIcon\n"));
|
|
DestroyIcon(m_hIcon);
|
|
m_hIcon = NULL;
|
|
}
|
|
if(m_hFont) {
|
|
Dbg(("Delete FONT\n"));
|
|
DeleteObject(m_hFont);
|
|
m_hFont = NULL;
|
|
}
|
|
if(m_lpwstrText) {
|
|
MemFree(m_lpwstrText);
|
|
m_lpwstrText = NULL;
|
|
}
|
|
if(m_lpCDDBItem) {
|
|
Dbg(("Delete CDDBItem List\n"));
|
|
LPCDDBItem p, pTmp;
|
|
for(p = m_lpCDDBItem; p; p = pTmp) {
|
|
pTmp = p->next;
|
|
delete p;
|
|
}
|
|
m_lpCDDBItem = NULL;
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : RegisterWinClass
|
|
// Type : BOOL
|
|
// Purpose :
|
|
// Args :
|
|
// : LPSTR lpstrClassName
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
#ifndef UNDER_CE
|
|
BOOL CDDButton::RegisterWinClass(LPSTR lpstrClass)
|
|
#else // UNDER_CE
|
|
BOOL CDDButton::RegisterWinClass(LPTSTR lpstrClass)
|
|
#endif // UNDER_CE
|
|
{
|
|
ATOM ret;
|
|
//----------------------------------------------------------------
|
|
//check specified class is already exist or not
|
|
//----------------------------------------------------------------
|
|
#ifndef UNDER_CE // not support GetClassInfoEx
|
|
if(::GetClassInfoEx(m_hInst, lpstrClass, &m_tmpWC)){
|
|
//lpstrClass is already registerd.
|
|
return TRUE;
|
|
}
|
|
#else // UNDER_CE
|
|
if(::GetClassInfo(m_hInst, lpstrClass, &m_tmpWC)){
|
|
//lpstrClass is already registerd.
|
|
return TRUE;
|
|
}
|
|
#endif // UNDER_CE
|
|
::ZeroMemory(&m_tmpWC, sizeof(m_tmpWC));
|
|
#ifndef UNDER_CE // not support RegisterClassEx
|
|
m_tmpWC.cbSize = sizeof(m_tmpWC);
|
|
#endif // UNDER_CE
|
|
m_tmpWC.style = CS_HREDRAW | CS_VREDRAW; /* Class style(s). */
|
|
m_tmpWC.lpfnWndProc = (WNDPROC)WndProc;
|
|
m_tmpWC.cbClsExtra = 0; /* No per-class extra data.*/
|
|
m_tmpWC.cbWndExtra = sizeof(LPCDDButton); // Set Object's pointer.
|
|
m_tmpWC.hInstance = m_hInst; /* Application that owns the class. */
|
|
m_tmpWC.hIcon = NULL;
|
|
m_tmpWC.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
m_tmpWC.hbrBackground = (HBRUSH)NULL;
|
|
//m_tmpWC.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
|
|
m_tmpWC.lpszMenuName = NULL; /* Name of menu resource in .RC file. */
|
|
m_tmpWC.lpszClassName = lpstrClass; /* Name used in call to CreateWindow. */
|
|
#ifndef UNDER_CE // not support RegisterClassEx
|
|
m_tmpWC.hIconSm = NULL;
|
|
ret = ::RegisterClassEx(&m_tmpWC);
|
|
#else // UNDER_CE
|
|
ret = ::RegisterClass(&m_tmpWC);
|
|
#endif // UNDER_CE
|
|
return ret ? TRUE: FALSE;
|
|
}
|
|
|
|
INT CDDButton::MsgCreate(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
m_hwndFrame = hwnd;
|
|
return 1;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgPaint
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgPaint(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
PAINTSTRUCT ps;
|
|
RECT rc;
|
|
HDC hDCMem;
|
|
HDC hDC;
|
|
HBITMAP hBitmap, hBitmapPrev;
|
|
|
|
|
|
::GetClientRect(hwnd, &rc);
|
|
hDC = ::BeginPaint(hwnd, &ps);
|
|
hDCMem = ::CreateCompatibleDC(hDC);
|
|
hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);
|
|
hBitmapPrev = (HBITMAP)::SelectObject(hDCMem, hBitmap);
|
|
|
|
DrawButton(hDCMem, &rc);
|
|
|
|
::BitBlt(hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
|
|
hDCMem, 0, 0, SRCCOPY);
|
|
|
|
::SelectObject(hDCMem, hBitmapPrev );
|
|
|
|
::DeleteObject(hBitmap);
|
|
::DeleteDC(hDCMem);
|
|
::EndPaint(hwnd, &ps);
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
INT CDDButton::MsgDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
INT CDDButton::MsgTimer(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
#ifndef UNDER_CE // no monitor position. (not support GetCursorPos)
|
|
static RECT rc;
|
|
static POINT pt;
|
|
if(wParam == TIMERID_MONITORPOS) {
|
|
::GetWindowRect(hwnd, &rc);
|
|
::GetCursorPos(&pt);
|
|
if(!PtInRect(&rc, pt)) {
|
|
::KillTimer(hwnd, wParam);
|
|
::InvalidateRect(hwnd, NULL, NULL);
|
|
}
|
|
}
|
|
#endif // UNDER_CE
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgMouseMove
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgMouseMove(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
#ifdef UNDER_CE // Windows CE does not support GetCursorPos
|
|
m_ptEventPoint.x = (SHORT)LOWORD(lParam);
|
|
m_ptEventPoint.y = (SHORT)HIWORD(lParam);
|
|
#endif // UNDER_CE
|
|
#ifndef UNDER_CE // no monitor position. (not support GetCursorPos)
|
|
KillTimer(hwnd, TIMERID_MONITORPOS);
|
|
SetTimer(hwnd, TIMERID_MONITORPOS, 100, NULL);
|
|
#endif // UNDER_CE
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgButtonDown
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : UINT uMsg
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgButtonDown(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
static RECT rc;
|
|
Dbg(("MsgButtonDown uMsg [0x%08x] x[%d] y[%d]\n",
|
|
uMsg,
|
|
LOWORD(lParam),
|
|
HIWORD(lParam)));
|
|
if(uMsg != WM_LBUTTONDOWN && uMsg != WM_LBUTTONDBLCLK ) {
|
|
return 0;
|
|
}
|
|
|
|
if(!m_fEnable)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
#ifdef UNDER_CE // Windows CE does not support GetCursorPos
|
|
m_ptEventPoint.x = (SHORT)LOWORD(lParam);
|
|
m_ptEventPoint.y = (SHORT)HIWORD(lParam);
|
|
#endif // UNDER_CE
|
|
INT bID = GetButtonFromPos(LOWORD(lParam), HIWORD(lParam));
|
|
Dbg(("bID[%d] m_fExitMenuLoop [%d]\n", bID, m_fExitMenuLoop));
|
|
switch(bID) {
|
|
case BID_BUTTON:
|
|
if(m_fExitMenuLoop) {
|
|
m_fExitMenuLoop = FALSE;
|
|
}
|
|
m_bidDown = bID;
|
|
if(m_f16bitOnNT) {
|
|
}
|
|
else {
|
|
::SetCapture(hwnd);
|
|
}
|
|
break;
|
|
case BID_ALL:
|
|
case BID_DROPDOWN:
|
|
if(m_fExitMenuLoop) {
|
|
m_fExitMenuLoop = FALSE;
|
|
m_bidDown = BID_UNDEF;
|
|
return 0;
|
|
}
|
|
m_bidDown = bID;
|
|
//----------------------------------------------------------------
|
|
// do not call popup menu here.
|
|
// first, end WM_XBUTTON down message and return to
|
|
// window message loop.
|
|
//----------------------------------------------------------------
|
|
//::PostMessage(hwnd, WM_COMMAND, (WPARAM)CMD_DROPDOWN, 0L);
|
|
::PostMessage(hwnd, WM_USER_COMMAND, (WPARAM)CMD_DROPDOWN, 0L);
|
|
break;
|
|
case BID_UNDEF:
|
|
default:
|
|
break;
|
|
}
|
|
::InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgButtonUp
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : UINT uMsg
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgButtonUp(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if(!m_fEnable)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
#ifdef UNDER_CE // Windows CE does not support GetCursorPos
|
|
m_ptEventPoint.x = (SHORT)LOWORD(lParam);
|
|
m_ptEventPoint.y = (SHORT)HIWORD(lParam);
|
|
#endif // UNDER_CE
|
|
switch(m_bidDown) {
|
|
case BID_BUTTON:
|
|
{
|
|
ReleaseCapture();
|
|
INT bid = GetButtonFromPos(LOWORD(lParam), HIWORD(lParam));
|
|
INT newIndex;
|
|
if(bid == BID_BUTTON) {
|
|
newIndex = IncrementIndex();
|
|
NotifyToParent(DDBN_CLICKED);
|
|
if(newIndex != -1) {
|
|
NotifyToParent(DDBN_SELCHANGE);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case BID_ALL:
|
|
case BID_DROPDOWN:
|
|
if(m_f16bitOnNT) {
|
|
m_bidDown = BID_UNDEF;
|
|
}
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
break;
|
|
}
|
|
m_bidDown = BID_UNDEF;
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
Unref(uMsg);
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgCaptureChanged
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgCaptureChanged(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
m_bidDown = BID_UNDEF;
|
|
::InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgExitMenuLoop
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgExitMenuLoop(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
Dbg(("WM_EXITMENULOOP\n"));
|
|
#ifndef UNDER_CE // Windows CE does not support GetCursorPos()
|
|
::GetCursorPos(&m_tmpPoint);
|
|
::GetClientRect(m_hwndFrame, &m_tmpRect);
|
|
::ScreenToClient(m_hwndFrame, &m_tmpPoint);
|
|
|
|
if(PtInRect(&m_tmpRect, m_tmpPoint)) {
|
|
m_fExitMenuLoop = TRUE;
|
|
}
|
|
else {
|
|
m_fExitMenuLoop = FALSE;
|
|
}
|
|
#else // UNDER_CE
|
|
m_fExitMenuLoop = FALSE;
|
|
#endif // UNDER_CE
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgCommand
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
INT index;
|
|
switch(wParam) {
|
|
case CMD_DROPDOWN:
|
|
NotifyToParent(DDBN_DROPDOWN);
|
|
index = DropDownItemList();
|
|
m_bidDown = BID_UNDEF;
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
NotifyToParent(DDBN_CLOSEUP);
|
|
//Dbg(("new Index %d\n", index));
|
|
if(index != -1 && index != m_curDDBItemIndex) {
|
|
m_curDDBItemIndex = index;
|
|
NotifyToParent(DDBN_SELCHANGE);
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
INT CDDButton::MsgUserCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return MsgCommand(hwnd, wParam, lParam);
|
|
}
|
|
|
|
INT CDDButton::MsgSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
HFONT hFont = (HFONT)wParam;
|
|
BOOL fRedraw = LOWORD(lParam);
|
|
|
|
HFONT hFontNew;
|
|
if(!hFont) {
|
|
return 0;
|
|
}
|
|
#ifndef UNDER_CE
|
|
LOGFONTA logFont;
|
|
#else // UNDER_CE
|
|
LOGFONT logFont;
|
|
#endif // UNDER_CE
|
|
::GetObject(hFont, sizeof(logFont), &logFont);
|
|
|
|
hFontNew = ::CreateFontIndirect(&logFont);
|
|
if(!hFontNew) {
|
|
return 0;
|
|
}
|
|
if(m_hFont) {
|
|
::DeleteObject(m_hFont);
|
|
}
|
|
m_hFont = hFontNew;
|
|
if(fRedraw) {
|
|
::InvalidateRect(hwnd, NULL, TRUE);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
INT CDDButton::MsgMeasureItem(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
Dbg(("MsgMeasureItem START\n"));
|
|
LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam;
|
|
switch(lpmis->CtlType) {
|
|
case ODT_MENU:
|
|
Dbg(("MsgMeasureItem END\n"));
|
|
return MenuMeasureItem(hwnd, lpmis);
|
|
break;
|
|
}
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
INT CDDButton::MsgDrawItem(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
|
|
switch(lpdis->CtlType) {
|
|
case ODT_MENU:
|
|
return MenuDrawItem(hwnd, lpdis);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgDDB_AddItem
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgDDB_AddItem(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LPDDBITEM lpItem = (LPDDBITEM)lParam;
|
|
LPCDDBItem lpCItem = new CDDBItem;
|
|
if(!lpCItem) {
|
|
return -1;
|
|
}
|
|
lpCItem->SetTextW(lpItem->lpwstr);
|
|
InsertDDBItem(lpCItem, -1);
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgDDB_InsertItem
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgDDB_InsertItem(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LPDDBITEM lpItem = (LPDDBITEM)lParam;
|
|
LPCDDBItem lpCItem = new CDDBItem;
|
|
if(!lpCItem) {
|
|
return -1;
|
|
}
|
|
lpCItem->SetTextW(lpItem->lpwstr);
|
|
InsertDDBItem(lpCItem, (INT)wParam);
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgDDB_SetCurSel
|
|
// Type : INT
|
|
// Purpose : Set current selection.
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam INT index
|
|
// : LPARAM lParam no use:
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgDDB_SetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
INT count = GetDDBItemCount();
|
|
if(count <=0) {
|
|
return -1;
|
|
}
|
|
if(0 <= (INT)wParam && count <= (INT)wParam) {
|
|
return -1;
|
|
}
|
|
m_curDDBItemIndex = (INT)wParam;
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgDDB_GetCurSel
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam no use.
|
|
// : LPARAM lParam no use.
|
|
// Return : return current item's index. (ZERO based)
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgDDB_GetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return m_curDDBItemIndex;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgDDB_SetIcon
|
|
// Type : INT
|
|
// Purpose : Set new icon.
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam HICON hIcon.
|
|
// : LPARAM lParam no use.
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgDDB_SetIcon(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
Dbg(("MsgDDB_SetIcon: wParam[0x%08x] lParam[0x%08x]\n", wParam, lParam));
|
|
if((HICON)wParam == NULL) {
|
|
Dbg(("MsgDDB_SetIcon: ERROR END\n"));
|
|
return -1;
|
|
}
|
|
//if icon style is not set, destroy specified icon
|
|
if(!(m_dwStyle & DDBS_ICON)) {
|
|
DestroyIcon((HICON)wParam);
|
|
return -1;
|
|
}
|
|
if(m_hIcon) {
|
|
DestroyIcon(m_hIcon);
|
|
}
|
|
m_hIcon = (HICON)wParam;
|
|
|
|
//----------------------------------------------------------------
|
|
//Get Icon width and height.
|
|
//----------------------------------------------------------------
|
|
#ifndef UNDER_CE // Windows CE does not support GetIconInfo()
|
|
ZeroMemory(&m_tmpIconInfo, sizeof(m_tmpIconInfo));
|
|
::GetIconInfo(m_hIcon, &m_tmpIconInfo);
|
|
Dbg(("fIcon [%d]\n", m_tmpIconInfo.fIcon ));
|
|
Dbg(("xHotspot [%d]\n", m_tmpIconInfo.xHotspot ));
|
|
Dbg(("yHotspot [%d]\n", m_tmpIconInfo.yHotspot ));
|
|
Dbg(("hbmMask [0x%08x]\n", m_tmpIconInfo.hbmMask ));
|
|
Dbg(("hbmColor [0x%08x]\n", m_tmpIconInfo.hbmColor ));
|
|
|
|
if(m_tmpIconInfo.hbmMask) {
|
|
GetObject(m_tmpIconInfo.hbmMask, sizeof(m_tmpBitmap), &m_tmpBitmap);
|
|
Dbg(("bmWidth[%d] bmHeight[%d]\n",
|
|
m_tmpBitmap.bmWidth,
|
|
m_tmpBitmap.bmHeight));
|
|
DeleteObject(m_tmpIconInfo.hbmMask);
|
|
m_cxIcon = m_tmpBitmap.bmWidth;
|
|
m_cyIcon = m_tmpBitmap.bmHeight;
|
|
}
|
|
if(m_tmpIconInfo.hbmColor) {
|
|
DeleteObject(m_tmpIconInfo.hbmColor);
|
|
}
|
|
#else // UNDER_CE
|
|
m_cxIcon = GetSystemMetrics(SM_CXSMICON);
|
|
m_cyIcon = GetSystemMetrics(SM_CYSMICON);
|
|
#endif // UNDER_CE
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgDDB_SetText
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam LPWSTR lpwstr: null terminated Unicode string.
|
|
// : LPARAM lParam no use.
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgDDB_SetText(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if(!(LPWSTR)wParam) {
|
|
return -1;
|
|
}
|
|
|
|
if( ((LPWSTR)wParam)[0] == (WCHAR)0x0000) {
|
|
return -1;
|
|
}
|
|
|
|
if(m_lpwstrText) {
|
|
MemFree(m_lpwstrText);
|
|
}
|
|
|
|
m_lpwstrText = StrdupW((LPWSTR)wParam);
|
|
#ifdef MSAA
|
|
if(::IsWindowUnicode(hwnd)) {
|
|
::SetWindowTextW(hwnd, m_lpwstrText);
|
|
}
|
|
else {
|
|
if(m_lpwstrText) {
|
|
INT len = ::lstrlenW(m_lpwstrText);
|
|
LPSTR lpstr = (LPSTR)MemAlloc((len + 1)*sizeof(WCHAR));
|
|
if(lpstr) {
|
|
|
|
#if 0 //for remove warning
|
|
INT ret = ::WideCharToMultiByte(CP_ACP,
|
|
WC_COMPOSITECHECK,
|
|
m_lpwstrText, -1,
|
|
lpstr, (len+1)*sizeof(WCHAR),
|
|
0, 0);
|
|
#endif
|
|
::WideCharToMultiByte(CP_ACP,
|
|
WC_COMPOSITECHECK,
|
|
m_lpwstrText, -1,
|
|
lpstr, (len+1)*sizeof(WCHAR),
|
|
0, 0);
|
|
::SetWindowTextA(hwnd, lpstr);
|
|
MemFree(lpstr);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
Unref(lParam);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgDDB_SetStyle
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam DWORD dwStyle:
|
|
// : LPARAM lParam no use.
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgDDB_SetStyle(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
DWORD dwStyle = (DWORD)wParam;
|
|
#if 0 //DDBS_TEXT is 0...
|
|
if((dwStyle & DDBS_TEXT) &&
|
|
(dwStyle & DDBS_ICON)) {
|
|
return -1;
|
|
}
|
|
#endif
|
|
m_dwStyle = dwStyle;
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
Unref(hwnd);
|
|
Unref(lParam);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CDDButton::MsgEnable
|
|
// Type : INT
|
|
// Purpose :
|
|
// Args :
|
|
// : HWND hwnd
|
|
// : WPARAM wParam
|
|
// : LPARAM lParam
|
|
// Return :
|
|
// DATE :
|
|
//////////////////////////////////////////////////////////////////
|
|
INT CDDButton::MsgEnable(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
//Dbg(("MsgEnabled START wParam[%d]\n", wParam));
|
|
m_fEnable = (BOOL)wParam;
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
return 0;
|
|
UnrefForMsg();
|
|
}
|
|
|