BOOL RegisterCoolBarControl (void)
{
    WNDCLASS WndClass;
        
    WndClass.spClassName = CTRL_COOLBAR;
    WndClass.dwStyle     = WS_NONE;
    WndClass.dwExStyle   = WS_EX_NONE;
    WndClass.hCursor     = GetSystemCursor (IDC_ARROW);
    WndClass.iBkColor    = GetWindowElementPixel (HWND_DESKTOP, WE_MAINC_THREED_BODY);
    WndClass.WinProc     = CoolBarCtrlProc;

    return AddNewControlClass (&WndClass) == ERR_OK;
}
static BOOL RegisterContainer (void)
{
    WNDCLASS WndClass;

    WndClass.spClassName = CTRL_CONTAINER;
    WndClass.dwStyle     = WS_NONE;
    WndClass.dwExStyle   = WS_EX_NONE;
    WndClass.hCursor     = GetSystemCursor (IDC_ARROW);
    WndClass.iBkColor    = GetWindowElementPixel (HWND_NULL, WE_BGC_WINDOW);
    WndClass.WinProc     = DefaultContainerProc;

    return AddNewControlClass (&WndClass) == ERR_OK;
}
BOOL RegisterPropSheetControl (void)
{
    WNDCLASS WndClass;

    WndClass.spClassName = CTRL_PROPSHEET;
    WndClass.dwStyle     = WS_NONE;
    WndClass.dwExStyle   = WS_EX_NONE;
    WndClass.hCursor     = GetSystemCursor (0);
    WndClass.iBkColor    = 
    GetWindowElementPixel (HWND_NULL, WE_MAINC_THREED_BODY);
    WndClass.WinProc     = PropSheetCtrlProc;

    return AddNewControlClass (&WndClass) == ERR_OK;
}
BOOL RegisterScrollWndControl (void)
{
    WNDCLASS WndClass;

    if (!RegisterContainer ())
        return FALSE;

    WndClass.spClassName = CTRL_SCROLLWND;
    WndClass.dwStyle     = WS_NONE;
    WndClass.dwExStyle   = WS_EX_NONE;
    WndClass.hCursor     = GetSystemCursor (IDC_ARROW);
    WndClass.iBkColor    = GetWindowElementPixel (HWND_NULL, WE_BGC_WINDOW);
    WndClass.WinProc     = ScrollWndCtrlProc;

    return AddNewControlClass (&WndClass) == ERR_OK;
}
Beispiel #5
0
BOOL RegisterCoolIndicatorControl (void)
{
    WNDCLASS WndClass;
        
    WndClass.spClassName = CTRL_COOL_INDICATOR;
    WndClass.dwStyle     = WS_NONE;
    WndClass.dwExStyle   = WS_EX_NONE;
    WndClass.hCursor     = GetSystemCursor (IDC_ARROW);
    WndClass.iBkColor    = GetWindowElementPixel (HWND_DESKTOP, WE_MAINC_THREED_BODY);
    WndClass.WinProc     = CoolIndicatorCtrlProc;

	if(RegisterWindowClass(&WndClass) == FALSE) {
		db_error("register Cool Indicator failed\n");
		return FALSE;
	}

	return TRUE;
}
/* window procedure of the property sheet. */
static int 
PropSheetCtrlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)
{
    PCONTROL      ctrl;
    PPROPSHEETDATA propsheet;

    ctrl = gui_Control (hwnd); 
    propsheet = (PROPSHEETDATA *) ctrl->dwAddData2;
    
    switch (message) {
        
    case MSG_CREATE: {
#ifdef __TARGET_MSTUDIO__
        SetWindowBkColor(hwnd, 
                GetWindowElementPixel (hwnd, WE_MAINC_THREED_BODY));
#endif

        if (!(propsheet = calloc (1, sizeof (PROPSHEETDATA)))) {
            return -1;
        }
        ctrl->dwAddData2 = (DWORD)propsheet;
        break;
    }
        
    /* make the client size same as window size */
    case MSG_SIZECHANGED: {
        const RECT* rcWin = (RECT *)wParam;
        RECT* rcClient = (RECT *)lParam;
        
        /* cale the width of content page */
        *rcClient = *rcWin;
        propsheet->head_rc.right = RECTWP (rcClient);

        if ((ctrl->dwStyle & 0xf0L) == PSS_BOTTOM) {
            propsheet->head_rc.top = RECTHP (rcClient) - get_metrics (MWM_ICONY)
                - 2 - _ICON_OFFSET * 2;
            propsheet->head_rc.bottom = RECTHP (rcClient);
        } else {
            propsheet->head_rc.bottom = get_metrics (MWM_ICONY) + 2 
                + _ICON_OFFSET * 2;
        }

        if ((ctrl->dwStyle & 0x0fL)!= PSS_SCROLLABLE) {
            recalc_tab_widths (hwnd, propsheet, ctrl->dwStyle);
        } else {
            HDC hdc; 
            propsheet->head_width = propsheet->head_rc.right;

            if (propsheet->head) {
                PPROPPAGE page;
                hdc = GetClientDC(hwnd);
                page = propsheet->head;
                while(page) {
                    page->width = tab_required_width (hdc, propsheet, page);
                    page = page->next;
                }

                ReleaseDC (hdc);

                update_propsheet (propsheet);
            }
        }
        resize_children (propsheet, rcClient, ctrl->dwStyle);
        InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
        return 1;
    }

    case MSG_DESTROY: {
        PPROPPAGE page, temp;
        page = propsheet->head;
        while (page) {
            temp = page->next;
            destroy_page (page);
            free (page);
            page = temp;
        }
        free (propsheet);
        break;
    }

    case MSG_GETDLGCODE: {
        return DLGC_WANTTAB | DLGC_WANTARROWS;
    }
     
    case PSM_SHEETCMD: {
        int index = 0;
        PPROPPAGE page = propsheet->head;
        while (page) {
            if (SendMessage (page->hwnd, MSG_SHEETCMD, wParam, lParam))
                /* when encounter an error, return page index plus 1. */
                return index + 1;
            index++;
            page = page->next;
        }
        return 0; /* success */
    }

    case PSM_SETACTIVEINDEX: {
        PPROPPAGE page;

        if ((page = get_page (propsheet, wParam)) && page != propsheet->active)         {
            show_hide_page (propsheet->active, SW_HIDE);
            propsheet->active = page;
            update_propsheet (propsheet);
            NotifyParent (hwnd, ctrl->id, PSN_ACTIVE_CHANGED);
            show_hide_page (page, SW_SHOW);
            
            InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
            return PS_OKAY;
        }
        return PS_ERR;
    }
        
    case PSM_GETACTIVEINDEX: {
        int index = 0;
        PPROPPAGE page = propsheet->head;
        while (page) {
            if (page == propsheet->active) {
                return index;
            }
            index ++;
            page = page->next;
        }
        return PS_ERR;
    }

    case PSM_GETACTIVEPAGE: {
        return (propsheet->active) ? 
          propsheet->active->hwnd : HWND_INVALID;
    }

    case PSM_GETPAGE: {
        int index = 0;
        PPROPPAGE page = propsheet->head;
        while (page) {
            if (index == wParam) {
                return page->hwnd;
            }
            index ++;
            page = page->next;
        }
        return HWND_INVALID;
    }
        
    case PSM_GETPAGEINDEX: {
        int index = 0;
        PPROPPAGE page = propsheet->head;
        while (page) {
            if (page->hwnd == wParam) {
                return index;
            }
            index ++;
            page = page->next;
        }
        return PS_ERR;
    }
        
    case PSM_GETPAGECOUNT: {
        return propsheet->page_count;
    }

    case PSM_GETTITLELENGTH: {
        int len = PS_ERR;
        PPROPPAGE page;
        
        if ((page = get_page (propsheet, wParam))) {
            len = strlen (page->title);
        }
        return len;
    }

    case PSM_GETTITLE: {
        char* buffer = (char*)lParam;
        PPROPPAGE page;
        
        if ((page = get_page (propsheet, wParam))) {
            strcpy (buffer, page->title);
            return PS_OKAY;
        }
        
        return PS_ERR;
    }

    case PSM_SETTITLE: {
        BOOL rc = PS_ERR;
        char* buffer = (char*)lParam;
        PPROPPAGE page;
        HDC hdc;
        if ((ctrl->dwStyle & 0x0fL) != PSS_SCROLLABLE) {
            if ((page = get_page (propsheet, wParam))) {
                rc = set_page_title (page, buffer);
                recalc_tab_widths (hwnd, propsheet, ctrl->dwStyle);
                InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
            }
        } else {
            if ((page = get_page (propsheet, wParam))) {
                hdc = GetClientDC (hwnd);
                rc = set_page_title_normal_style (hdc, propsheet, page, buffer);
                ReleaseDC (hdc);
                InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
            }
        }
        return rc;
    }

    case PSM_ADDPAGE: {
        if ((ctrl->dwStyle & 0x0fL)  != PSS_SCROLLABLE) {
            int index;
            PPROPPAGE page;
            if ((propsheet->head_rc.right / (propsheet->page_count + 1)) < 
                    _MIN_TAB_WIDTH) {
                return PS_ERR;
            }
            if (!(page = calloc (1, sizeof (PROPPAGE)))) {
                return PS_ERR;
            }
            if (!create_page (hwnd, ctrl->dwStyle, propsheet, page, 
                        (DLGTEMPLATE *)wParam, (WNDPROC)lParam)) {
                free (page);
                return PS_ERR;
            }
            
            index = append_page (propsheet, page);
            if (propsheet->active) {
                show_hide_page (propsheet->active, SW_HIDE);
            }
            propsheet->active = page;
            NotifyParent (hwnd, ctrl->id, PSN_ACTIVE_CHANGED);
            show_hide_page (page, SW_SHOW);
            recalc_tab_widths (hwnd, propsheet, ctrl->dwStyle);
            InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
            return index;
        } else {
            return add_new_page_normal_style (hwnd, ctrl, 
                       propsheet, (DLGTEMPLATE *)wParam, 
                      (WNDPROC)lParam);
        }
    }
        
    case PSM_REMOVEPAGE: {
        if ((ctrl->dwStyle & 0x0fL) != PSS_SCROLLABLE) {
            PPROPPAGE page;
            if ((page = get_page (propsheet, wParam))) {
                remove_page (propsheet, page);
                destroy_page (page);
                free (page);
                recalc_tab_widths (hwnd, propsheet, ctrl->dwStyle);
            } else {
                return PS_ERR;
            }
            if (propsheet->active == page) {
                propsheet->active = propsheet->head;
                NotifyParent (hwnd, ctrl->id, PSN_ACTIVE_CHANGED);
                if (propsheet->active) {
                    show_hide_page (propsheet->active, SW_SHOW);
                }
            }
            InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
            return PS_OKAY;
        } else {
            return delete_page (hwnd, ctrl, propsheet, wParam);
        }
    }
        
    case MSG_LBUTTONDOWN: {
        click_tab_bar (hwnd, ctrl, propsheet, lParam);
        /* dump_propsheetdata (propsheet); */
        break;
    }

    case MSG_KEYDOWN: {
        PPROPPAGE page, new_active = NULL;
        if (!(lParam & KS_CTRL) || (propsheet->head == NULL)) {
            break;
        }
        /* Key borad message for PSS_COMPACTTAB and PSS_SIMPLE */
        switch (LOWORD (wParam)) {
        case SCANCODE_CURSORBLOCKDOWN:
        case SCANCODE_CURSORBLOCKRIGHT:
            if ((ctrl->dwStyle & 0x0fL)!= PSS_SCROLLABLE) {
                new_active = propsheet->active->next;
                if (new_active == NULL)
                    new_active = propsheet->head;
                break;
            } else {
                scroll_tab_right (hwnd, ctrl, propsheet);
                InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
                return 0;
            }
        case SCANCODE_CURSORBLOCKUP:
        case SCANCODE_CURSORBLOCKLEFT:
            if ((ctrl->dwStyle & 0x0fL)!= PSS_SCROLLABLE) {
                page = propsheet->head;
                if (propsheet->head == propsheet->active) {
                    while (page && page->next) {
                        page = page->next;
                    }
                } else {
                    while (page) {
                        if (page->next == propsheet->active)
                            break;
                        page = page->next;
                    }
                }
                new_active = page;
                break;
            } else {
                scroll_tab_left (hwnd, ctrl, propsheet);
                InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
                return 0;
            }
        }  /* switch */
        if (new_active == NULL) {
            break;
        }
        show_hide_page (propsheet->active, SW_HIDE);
        propsheet->active = new_active;
        NotifyParent (hwnd, ctrl->id, PSN_ACTIVE_CHANGED);
        show_hide_page (new_active, SW_SHOW);
        InvalidateRect (hwnd, &propsheet->head_rc, TRUE);
        return 0;
    }

    case MSG_NCPAINT:
        
    case MSG_PAINT: {
        HDC  hdc = BeginPaint (hwnd);
        PPROPPAGE page = ((ctrl->dwStyle & 0x0fL) == PSS_SCROLLABLE) ? 
          propsheet->first_display_page : propsheet->head;
        draw_propsheet (hwnd, hdc, ctrl, propsheet, page);
        EndPaint (hwnd, hdc);
        return 0;
    }
        
    default:
        break;
    }
    
    return DefaultControlProc (hwnd, message, wParam, lParam);
}
Beispiel #7
0
static int msgBoxProc(HWND hDlg, int message, WPARAM wParam, LPARAM lParam )
{
	MBPrivData* privData;
	switch(message) {
	case MSG_FONTCHANGED:
		{
			HWND hChild;	
			hChild = GetNextChild(hDlg, 0);
			while( hChild && (hChild != HWND_INVALID) )
			{
				SetWindowFont(hChild, GetWindowFont(hDlg));
				hChild = GetNextChild(hDlg, hChild);
			}
		}
		break;
	case MSG_INITDIALOG:
		{
			unsigned int dwStyle;
			MessageBox_t* info = (MessageBox_t *)lParam;
			if(info == NULL) {
				db_error("invalid info\n");	
				return -1;
			}
			dwStyle = info->dwStyle & MB_TYPEMASK;

			privData = (MBPrivData*)malloc(sizeof(MBPrivData));
			privData->dwStyle = dwStyle;
			if(privData->dwStyle & MB_OKCANCEL){
				privData->IDCSelected = IDC_BUTTON_START + 1;
				privData->buttonNRs = 2;
			} else {
				privData->IDCSelected = IDC_BUTTON_START;
				privData->buttonNRs = 1;
			}
			db_msg("buttonNRs is %d\n", privData->buttonNRs);

			privData->flag_end_key = info->flag_end_key;
			privData->linecTitle = info->linecTitle;
			privData->linecItem = info->linecItem;
			privData->confirmCallback = info->confirmCallback;
			privData->confirmData = info->confirmData;
			privData->msg4ConfirmCallback = info->msg4ConfirmCallback;
			SetWindowAdditionalData(hDlg, (DWORD)privData);

			SetWindowFont(hDlg, info->pLogFont);

			/******* the hilight is the global attibute *******/
			gp_hilite_bgc = GetWindowElementPixel(hDlg, WE_BGC_HIGHLIGHT_ITEM);
			gp_hilite_fgc = GetWindowElementPixel(hDlg, WE_FGC_HIGHLIGHT_ITEM);

			gp_normal_bgc = info->bgcWidget;
			gp_normal_fgc = info->fgcWidget;
			SetWindowBkColor(hDlg, gp_normal_bgc);

			SetWindowElementAttr(GetDlgItem(hDlg, IDC_TITLE), WE_FGC_WINDOW, Pixel2DWORD(HDC_SCREEN, gp_normal_fgc));
			SetWindowElementAttr(GetDlgItem(hDlg, IDC_TEXT), WE_FGC_WINDOW, Pixel2DWORD(HDC_SCREEN, gp_normal_fgc));
			SetWindowText(GetDlgItem(hDlg, IDC_TITLE), info->title);
			SetWindowText(GetDlgItem(hDlg, IDC_TEXT), info->text);

			for(unsigned int i = 0; i < privData->buttonNRs; i++) {
				SetWindowElementAttr( GetDlgItem(hDlg, IDC_BUTTON_START + i), WE_FGC_WINDOW, Pixel2DWORD(HDC_SCREEN, gp_normal_fgc));
				SetWindowAdditionalData2( GetDlgItem(hDlg, IDC_BUTTON_START + i), (DWORD)info->buttonStr[i]);
			}
		}
		break;
	case MSG_KEYUP:
		{
			privData = (MBPrivData *)GetWindowAdditionalData(hDlg);
			switch(wParam) {
			case CDR_KEY_OK:
				if(privData->flag_end_key == 1) {
					db_msg("hDlg is %x\n", hDlg);
					if( (privData->IDCSelected == IDC_BUTTON_START) && privData->confirmCallback) {
						if(privData->msg4ConfirmCallback) {
							SetWindowText(GetDlgItem(hDlg, IDC_TEXT), privData->msg4ConfirmCallback);
							SetTimerEx(hDlg, TIMER_CONFIRM_CALLBACK, 5, timerCallback);
							SetNullFocus(hDlg);
						} else {
							db_msg("confirmCallback\n");
							(*privData->confirmCallback)(hDlg , privData->confirmData);
							db_msg("confirmCallback\n");
						}
					} else {
						EndDialog(hDlg, privData->IDCSelected);
					}
				}
				break;
			case CDR_KEY_MENU:
			case CDR_KEY_MODE:
				if(privData->flag_end_key == 1)
					EndDialog(hDlg, IDC_BUTTON_CANCEL);
				break;
			case CDR_KEY_LEFT:
				privData->IDCSelected--;
				if(privData->IDCSelected < IDC_BUTTON_START) {
					privData->IDCSelected = IDC_BUTTON_START + privData->buttonNRs - 1;
				}
				InvalidateRect(hDlg, NULL, TRUE);	
				break;
			case CDR_KEY_RIGHT:
				privData->IDCSelected++;
				if(privData->IDCSelected > (IDC_BUTTON_START + privData->buttonNRs - 1) ) {
					privData->IDCSelected = IDC_BUTTON_START;
				}
				InvalidateRect(hDlg, NULL, TRUE);	
				break;
			default:
				break;
			}
		}
		break;
	case MSG_KEYDOWN:
		{
			RECT rect;
			GetClientRect(hDlg, &rect);
			privData = (MBPrivData *)GetWindowAdditionalData(hDlg);
			switch(wParam) {
			case CDR_KEY_OK:
				if(privData->flag_end_key == 0) {
					db_msg("hDlg is %x\n", hDlg);
					if( (privData->IDCSelected == IDC_BUTTON_START) && privData->confirmCallback ) {
						if(privData->msg4ConfirmCallback) {
							SetWindowText(GetDlgItem(hDlg, IDC_TEXT), privData->msg4ConfirmCallback);
							SetTimerEx(hDlg, TIMER_CONFIRM_CALLBACK, 5, timerCallback);
							SetNullFocus(hDlg);
						} else {
							db_msg("confirmCallback\n");
							(*privData->confirmCallback)(hDlg , privData->confirmData);
							db_msg("confirmCallback\n");
						}
					} else {
						EndDialog(hDlg, privData->IDCSelected);	
					}
				}
				break;
			case CDR_KEY_MENU:
			case CDR_KEY_MODE:
				if(privData->flag_end_key == 0) {
					EndDialog(hDlg, 0);	
				}
				break;

			default:
				break;
			}
		}
		break;
	case MSG_PAINT:
		{
			RECT rect, rect1;
			HDC hdc = BeginPaint(hDlg);
			privData = (MBPrivData *)GetWindowAdditionalData(hDlg);

			GetClientRect(GetDlgItem(hDlg, IDC_TITLE), &rect);
			GetClientRect(hDlg, &rect1);
			/**** draw the line below the title *******/
			SetPenColor(hdc, privData->linecTitle );
			Line2(hdc, 1, RECTH(rect) + 1, RECTW(rect) - 2, RECTH(rect) + 1);

			/**** draw the line above the button *******/
			SetPenColor(hdc, privData->linecItem );
			Line2(hdc, 1, RECTH(rect1) * 3 / 4 - 2, RECTW(rect1) - 2, RECTH(rect1) * 3 / 4 - 2);

			unsigned int i;
			for(i = 0; i < privData->buttonNRs; i++) {
				if(IDC_BUTTON_START + i == privData->IDCSelected) {
					drawButton(hDlg, IDC_BUTTON_START + i, BUTTON_SELECTED);
				} else {
					drawButton(hDlg, IDC_BUTTON_START + i, BUTTON_UNSELECTED);
				}
			}
			EndPaint(hDlg, hdc);
		}
		break;
	case MSG_DESTROY: {
		db_msg("msg destroy");
		privData = (MBPrivData *)GetWindowAdditionalData(hDlg);
		if(privData)
			free(privData);
		}
		break;
	case MSG_CLOSE_TIP_LABEL:
		EndDialog(hDlg, 0);
		break;
	default:
		break;
	}

	return DefaultDialogProc (hDlg, message, wParam, lParam);
}