From bec57181ed3e9e94256eccdf528c563272f55020 Mon Sep 17 00:00:00 2001 From: ehouse Date: Sat, 10 May 2008 18:41:16 +0000 Subject: [PATCH] Work around apparent limitation to smartphone/ppc, that ownerdraw buttons don't generate WM_MESSAGE events and ownerdraw static controls don't get drawn: have one disabled ownerdraw button as the color sample and a real button to trigger the edit. --- wince/ceclrsel.c | 25 +++++----------- wince/resource.h | 78 ++++++++++++++++++++++++++++-------------------- wince/xwords4.rc | 37 +++++++++++++---------- 3 files changed, 75 insertions(+), 65 deletions(-) diff --git a/wince/ceclrsel.c b/wince/ceclrsel.c index d43b54992..6a9044684 100644 --- a/wince/ceclrsel.c +++ b/wince/ceclrsel.c @@ -275,8 +275,8 @@ typedef struct ColorsDlgState { XP_Bool inited; } ColorsDlgState; -#define FIRST_BUTTON DLBLTR_BUTTON -#define LAST_BUTTON PLAYER4_BUTTON +#define FIRST_BUTTON DLBLTR_SAMPLE +#define LAST_BUTTON PLAYER4_SAMPLE static void initColorData( ColorsDlgState* cState ) @@ -287,9 +287,11 @@ initColorData( ColorsDlgState* cState ) for ( i = 0; i < CE_NUM_EDITABLE_COLORS; ++i ) { COLORREF ref = cState->inColors[i]; + HWND button = GetDlgItem( cState->hDlg, FIRST_BUTTON + i ); cState->colors[i] = ref; cState->brushes[i] = CreateSolidBrush( ref ); - cState->buttons[i] = GetDlgItem( cState->hDlg, FIRST_BUTTON + i ); + cState->buttons[i] = button; + EnableWindow( button, FALSE ); } } /* initColorData */ @@ -375,16 +377,9 @@ ceDrawColorButton( ColorsDlgState* cState, DRAWITEMSTRUCT* dis ) XP_ASSERT( !!brush ); RECT rect = dis->rcItem; - XP_Bool hasFocus = ((dis->itemAction & ODA_FOCUS) != 0) - && ((dis->itemState & ODS_FOCUS) != 0); Rectangle( dis->hDC, rect.left, rect.top, rect.right, rect.bottom ); InsetRect( &rect, 1, 1 ); - if ( hasFocus ) { - Rectangle( dis->hDC, rect.left, rect.top, rect.right, rect.bottom ); - (void)SendMessage( cState->hDlg, DM_SETDEFID, dis->CtlID, 0 ); - } - InsetRect( &rect, 1, 1 ); FillRect( dis->hDC, &rect, brush ); } /* ceDrawColorButton */ @@ -415,8 +410,8 @@ ColorsDlg( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) state->inited = XP_TRUE; } -/* XP_LOGF( "%s: event=%s (%d); wParam=0x%x; lParam=0x%lx", */ -/* __func__, messageToStr(message), message, */ +/* XP_LOGF( "%s: event=%s (%d); wParam=0x%x; lParam=0x%lx", */ +/* __func__, messageToStr(message), message, */ /* wParam, lParam ); */ switch (message) { @@ -425,11 +420,7 @@ ColorsDlg( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) ceDoDlgScroll( state->globals, hDlg, wParam ); break; - case WM_DRAWITEM: /* passed when button has BS_OWNERDRAW style */ - ceDoDlgFocusScroll( state->globals, hDlg, - /* Fake out ceDoDlgFocusScroll, passing ctrl itself */ - (WPARAM)((DRAWITEMSTRUCT*)lParam)->hwndItem, - (LPARAM)TRUE ); + case WM_DRAWITEM: ceDrawColorButton( state, (DRAWITEMSTRUCT*)lParam ); result = TRUE; break; diff --git a/wince/resource.h b/wince/resource.h index 84308c8e6..7a46d90ed 100755 --- a/wince/resource.h +++ b/wince/resource.h @@ -114,64 +114,76 @@ #define PLAYER3_LABEL 1078 #define PLAYER4_LABEL 1079 +#define DLBLTR_SAMPLE 1080 +#define DBLWRD_SAMPLE 1081 +#define TPLLTR_SAMPLE 1082 +#define TPLWRD_SAMPLE 1083 +#define EMPCELL_SAMPLE 1084 +#define TBACK_SAMPLE 1085 +#define FOCUSCLR_SAMPLE 1086 +#define PLAYER1_SAMPLE 1087 +#define PLAYER2_SAMPLE 1088 +#define PLAYER3_SAMPLE 1089 +#define PLAYER4_SAMPLE 1090 + #define CLRSEL_LABEL_OFFSET (DLBLTR_LABEL-DLBLTR_BUTTON) /* editor dlg: assumption is that the edit field's ID is one more than the corresponding slider's */ #ifdef MY_COLOR_SEL -# define CLREDT_SLIDER1 1080 -# define RED_EDIT 1081 -# define CLREDT_SLIDER2 1082 -# define GREEN_EDIT 1083 -# define CLREDT_SLIDER3 1084 -# define BLUE_EDIT 1085 +# define CLREDT_SLIDER1 1091 +# define RED_EDIT 1092 +# define CLREDT_SLIDER2 1093 +# define GREEN_EDIT 1094 +# define CLREDT_SLIDER3 1095 +# define BLUE_EDIT 1096 -# define RED_LABEL 1086 -# define GREEN_LABEL 1087 -# define BLUE_LABEL 1088 +# define RED_LABEL 1097 +# define GREEN_LABEL 1098 +# define BLUE_LABEL 1099 #endif // MY_COLOR_SEL -#define HC_MIN_COMBO 1089 -#define HC_MAX_COMBO 1090 +#define HC_MIN_COMBO 1100 +#define HC_MAX_COMBO 1101 -#define IDC_CCONVIA_LAB 1091 +#define IDC_CCONVIA_LAB 1102 -#define IDC_COOKIE_LAB 1092 +#define IDC_COOKIE_LAB 1103 #ifdef XWFEATURE_RELAY -# define IDC_CRELAYNAME_LAB 1093 -# define IDC_CRELAYPORT_LAB 1094 -# define IDC_CRELAYHINT_LAB 1095 +# define IDC_CRELAYNAME_LAB 1104 +# define IDC_CRELAYPORT_LAB 1105 +# define IDC_CRELAYHINT_LAB 1106 -# define IDC_CONNECTCOMBO 1096 -# define RELAYNAME_EDIT 1097 -# define RELAYPORT_EDIT 1098 -# define COOKIE_EDIT 1099 +# define IDC_CONNECTCOMBO 1107 +# define RELAYNAME_EDIT 1108 +# define RELAYPORT_EDIT 1109 +# define COOKIE_EDIT 1110 #endif -#define IDC_BLUET_ADDR_LAB 1100 +#define IDC_BLUET_ADDR_LAB 1111 #ifdef XWFEATURE_BLUETOOTH -# define IDC_BLUET_ADDR_EDIT 1101 -# define IDC_BLUET_ADDR_BROWSE 1102 +# define IDC_BLUET_ADDR_EDIT 1112 +# define IDC_BLUET_ADDR_BROWSE 1113 #endif -#define IDS_UPDOWN 1103 -#define IDC_NPLAYERSUPDOWN 1104 -#define IDC_PHONIESUPDOWN 1105 -#define IDC_SVGM_UPDOWN 1106 +#define IDS_UPDOWN 1114 +#define IDC_NPLAYERSUPDOWN 1115 +#define IDC_PHONIESUPDOWN 1116 +#define IDC_SVGM_UPDOWN 1117 -#define IDC_SVGM_SELLAB 1109 -#define IDC_SVGM_GAMELIST 1110 +#define IDC_SVGM_SELLAB 1118 +#define IDC_SVGM_GAMELIST 1119 /* Let's remove these until they're implemented */ /* #define IDC_SVGM_EDITLAB 1111 */ /* #define IDC_SVGM_CHANGE 1112 */ /* #define IDC_SVGM_EDIT 1113 */ /* #define IDC_SVGM_DUP 1114 */ /* #define IDC_SVGM_DEL 1115 */ -#define IDC_SVGM_OPEN 1116 +#define IDC_SVGM_OPEN 1120 -#define IDC_SVGN_SELLAB 1117 -#define IDC_SVGN_EDIT 1118 +#define IDC_SVGN_SELLAB 1121 +#define IDC_SVGN_EDIT 1122 #define ID_FILE_EXIT 40002 @@ -228,7 +240,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 125 #define _APS_NEXT_COMMAND_VALUE 40029 -#define _APS_NEXT_CONTROL_VALUE 1087 +#define _APS_NEXT_CONTROL_VALUE 1123 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/wince/xwords4.rc b/wince/xwords4.rc index a5dc3b3d8..704a4fcea 100755 --- a/wince/xwords4.rc +++ b/wince/xwords4.rc @@ -622,7 +622,8 @@ END #define CLR_WIDTH 114 #define CLR_OK_LEFT ((CLR_WIDTH/2)-10-REPOS_BUTTON_WIDTH) #define CLR_CANCEL_LEFT ((CLR_WIDTH/2)+10) -#define CLR_LAB_WIDTH 50 +#define CLR_LAB_WIDTH 45 +#define CLR_SAMPLE_WIDTH 12 #define CLR_LAB_HT 12 #define CLR_BUT_WIDTH 12 #define CLR_BUT_HT 10 @@ -657,9 +658,15 @@ END #define COLOR_BUTTON(txt,id,xx,yy) \ LTEXT txt,id,xx,yy,CLR_LAB_WIDTH,CLR_LAB_HT -#define COLOR_SAMPLE(id,xx,yy) \ - PUSHBUTTON "",id,xx,yy,CLR_BUT_WIDTH,CLR_BUT_HT, \ - BS_OWNERDRAW + /* Hack alert. Smartphone isn't delivering WM_COMMAND events for + clicks on BS_OWNERDRAW buttons, and WinMo (PPC and Smartphone) + won't deliver WM_DRAWITEM events for SS_OWNERDRAW static + controls. The solution: use an OWNERDRAW button as the color + sample (must disable it in code; WS_DISABLED doesn't work here) + and have a separate button to trigger the edit dialog. */ +#define COLOR_SAMPLE(id1,id2,xx,yy) \ + PUSHBUTTON "",id2,xx,yy,CLR_BUT_WIDTH,CLR_BUT_HT,BS_OWNERDRAW \ + PUSHBUTTON "Edit",id1,xx+CLR_SAMPLE_WIDTH+4,yy,20,CLR_BUT_HT IDD_COLORSDLG DIALOG DISCARDABLE 0, 20, CLR_WIDTH, COLORSDLG_HT STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_CENTER | WS_VSCROLL @@ -667,29 +674,29 @@ CAPTION "Color preferences" FONT 8, "System" BEGIN COLOR_BUTTON("Double letter:",DLBLTR_LABEL,CLR_COL_1,CLR_ROW_1) - COLOR_SAMPLE(DLBLTR_BUTTON,CLR_COL_2,CLR_ROW_1) + COLOR_SAMPLE(DLBLTR_BUTTON,DLBLTR_SAMPLE,CLR_COL_2,CLR_ROW_1) COLOR_BUTTON("Double word:",DBLWRD_LABEL,CLR_COL_1,CLR_ROW_2 ) - COLOR_SAMPLE(DBLWRD_BUTTON,CLR_COL_2,CLR_ROW_2) + COLOR_SAMPLE(DBLWRD_BUTTON,DBLWRD_SAMPLE,CLR_COL_2,CLR_ROW_2) COLOR_BUTTON("Triple letter:",TPLLTR_LABEL,CLR_COL_1,CLR_ROW_3 ) - COLOR_SAMPLE(TPLLTR_BUTTON,CLR_COL_2,CLR_ROW_3) + COLOR_SAMPLE(TPLLTR_BUTTON,TPLLTR_SAMPLE,CLR_COL_2,CLR_ROW_3) COLOR_BUTTON("Triple word:",TPLWRD_LABEL,CLR_COL_3,CLR_ROW_4) - COLOR_SAMPLE(TPLWRD_BUTTON,CLR_COL_4,CLR_ROW_4) + COLOR_SAMPLE(TPLWRD_BUTTON,TPLWRD_SAMPLE,CLR_COL_4,CLR_ROW_4) COLOR_BUTTON("Empty cell:",EMPCELL_LABEL,CLR_COL_1,CLR_ROW_5) - COLOR_SAMPLE(EMPCELL_BUTTON,CLR_COL_2,CLR_ROW_5) + COLOR_SAMPLE(EMPCELL_BUTTON,EMPCELL_SAMPLE,CLR_COL_2,CLR_ROW_5) COLOR_BUTTON("Tile back:",TBACK_LABEL,CLR_COL_3,CLR_ROW_6) - COLOR_SAMPLE(TBACK_BUTTON,CLR_COL_4,CLR_ROW_6) + COLOR_SAMPLE(TBACK_BUTTON,TBACK_SAMPLE,CLR_COL_4,CLR_ROW_6) COLOR_BUTTON("Focus color:",FOCUSCLR_LABEL,CLR_COL_1,CLR_ROW_7) - COLOR_SAMPLE(FOCUSCLR_BUTTON,CLR_COL_2,CLR_ROW_7) + COLOR_SAMPLE(FOCUSCLR_BUTTON,FOCUSCLR_SAMPLE,CLR_COL_2,CLR_ROW_7) COLOR_BUTTON("Player 1:",PLAYER1_LABEL,CLR_COL_1,CLR_ROW_8) - COLOR_SAMPLE(PLAYER1_BUTTON,CLR_COL_2,CLR_ROW_8) + COLOR_SAMPLE(PLAYER1_BUTTON,PLAYER1_SAMPLE,CLR_COL_2,CLR_ROW_8) COLOR_BUTTON("Player 2:",PLAYER2_LABEL,CLR_COL_3,CLR_ROW_9) - COLOR_SAMPLE(PLAYER2_BUTTON,CLR_COL_4,CLR_ROW_9) + COLOR_SAMPLE(PLAYER2_BUTTON,PLAYER2_SAMPLE,CLR_COL_4,CLR_ROW_9) COLOR_BUTTON("Player 3:",PLAYER3_LABEL,CLR_COL_1,CLR_ROW_10) - COLOR_SAMPLE(PLAYER3_BUTTON,CLR_COL_2,CLR_ROW_10) + COLOR_SAMPLE(PLAYER3_BUTTON,PLAYER3_SAMPLE,CLR_COL_2,CLR_ROW_10) COLOR_BUTTON("Player 4:",PLAYER4_LABEL,CLR_COL_3,CLR_ROW_11) - COLOR_SAMPLE(PLAYER4_BUTTON,CLR_COL_4,CLR_ROW_11) + COLOR_SAMPLE(PLAYER4_BUTTON,PLAYER4_SAMPLE,CLR_COL_4,CLR_ROW_11) #ifndef _WIN32_WCE DEFPUSHBUTTON "OK",IDOK,CLR_OK_LEFT,CLR_BUTTON_ROW,