
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.133.33] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
![]() |
|
|
Добрый день.
Пишу программу на WinAPI. Создал TabSheet с помощью: ![]() ![]() TabSheet := CreateWindow(WC_TABCONTROL, '', WS_CHILD or WS_VISIBLE, 2, 0, 320, 227, Handle, TabSheet, hInst, nil); SendMessage(TabSheet, WM_SETFONT, hFont, 0); SendMessage(TabSheet, TCM_SETIMAGELIST, 0, ImageList); TabItem.mask := TCIF_TEXT or TCIF_IMAGE; TabItem.pszText := 'Пароль'; TabItem.cchTextMax := 0; TabItem.iImage := 0; SendMessage(TabSheet, TCM_INSERTITEM, 0, longint(@TabItem)); TabItem.iImage := 1; TabItem.pszText := 'Горячие клавиши'; SendMessage(TabSheet, TCM_INSERTITEM, 1, longint(@TabItem)); сделал две закладки. Вопрос: Какие мне ловить сообщения чтобы узнать, что выбрана другая закладка. И еще. Создал Лабел, но цвет заливки на TabSheet отличается от заливки на Label, как поменять цвет заливки на Label? |
![]() |
Сообщ.
#2
,
|
|
Цитата msdn TCN_SELCHANGE Notification --------------------------------------------------- Notifies a tab control's parent window that the currently selected tab has changed. This message is sent in the form of a WM_NOTIFY message. |
Сообщ.
#3
,
|
|
|
Цитата DemonXpPro @ Вопрос: Какие мне ловить сообщения чтобы узнать, что выбрана другая закладка. И еще. Создал Лабел, но цвет заливки на TabSheet отличается от заливки на Label, как поменять цвет заливки на Label? Приблизительно так: ![]() ![]() switch (message) { case WM_NOTIFY: NMHDR *ptab = (LPNMHDR) lParam; if ((ptab->code == TCN_SELCHANGE) && (ptab->hwndFrom == hwnd)) { // узнать номер нового таба tab_active = TabCtrl_GetCurSel ((HWND)ptab->hwndFrom); } break; ... } 2.) Не совсем понимаю, что такое Label. ![]() Вероятно надо обрабатывать сообщение WM_CTLCOLORSTATIC. Или одно из группы: WM_CTLCOLORxxx |
![]() |
Сообщ.
#4
,
|
|
Цитата DemonXpPro @ Создал Лабел, но цвет заливки на TabSheet отличается от заливки на Label, как поменять цвет заливки на Label? Цвет заливки по умолчанию должен быть одинаков. Можно зарисовать все градиентом из темы -- EnableThemeDialogTexture |
Сообщ.
#5
,
|
|
|
э. вот скрин. по поводу заливки
Добавлено Да. и что за структура "LPNMHDR" Прикреплённый файл ![]() |
![]() |
Сообщ.
#6
,
|
|
сделай статик прозрачным.
как сказали в 3м посте лови WM_CTLCOLORSTATIC и возвращай кисть нужного цвета чтоб статик был прозрачным должна возвращаться кисть полученная следующим образом: ![]() ![]() GetStockObject(NULL_BRUSH); Добавлено Цитата DemonXpPro @ Да. и что за структура "LPNMHDR" это указатель на экземпляр структуры.... в мсдн ведь всё написано.... параметр сообщения |
Сообщ.
#7
,
|
|
|
Цитата ЫукпШ @ ![]() ![]() switch (message) { case WM_NOTIFY: NMHDR *ptab = (LPNMHDR) lParam; if ((ptab->code == TCN_SELCHANGE) && (ptab->hwndFrom == hwnd)) { // узнать номер нового таба tab_active = TabCtrl_GetCurSel ((HWND)ptab->hwndFrom); } break; ... } Большое спасибо. -Added Цитата ElcnU @ сделай статик прозрачным. как сказали в 3м посте лови WM_CTLCOLORSTATIC и возвращай кисть нужного цвета чтоб статик был прозрачным должна возвращаться кисть полученная следующим образом: ![]() ![]() GetStockObject(NULL_BRUSH); А нельзя ли поподробнее(в коде). Просто я в вин апи нидавно, вот учусь ![]() Я не понил куда возвращать? |
![]() |
Сообщ.
#8
,
|
|
Цитата DemonXpPro @ А нельзя ли поподробнее(в коде). на си ![]() ![]() switch(message) { case WM_CTLCOLORSTATIC: if(GetDlgItem(IDC_MY_STATIC)==(HWND)lParam) { static HBRUSH hbrBackGnd=(HBRUSH)::GetStockObject(NULL_BRUSH); return hbrBackGnd; } break; ... Цитата DemonXpPro @ Я не понил куда возвращать? из оконной функции. смотри справку по указанному сообщению |
Сообщ.
#9
,
|
|
|
Цитата ElcnU @ ![]() ![]() switch(message) { case WM_CTLCOLORSTATIC: if(GetDlgItem(IDC_MY_STATIC)==(HWND)lParam) { static HBRUSH hbrBackGnd=(HBRUSH)::GetStockObject(NULL_BRUSH); return hbrBackGnd; } break; ... Спасибо. Сработало! Добавлено Всем спасибо. |
Сообщ.
#10
,
|
|
|
Блин. чево то опять не получается.
![]() Вот как я все делаю(пишу на делфах). ![]() ![]() program WB; uses windows, messages, commctrl, XPMan; //Используемые модули {$R icons.res} var WinClass : TWndClass; hInst : HWND; Handle : HWND; Msg : TMSG; hFont : HWND; Label1, Label2, Label3, Label4, Label5, Label6: HWND; Edit1, Edit2, Edit3, Edit4 : HWND; cRunWithWindows : HWND; TabSheet: HWND; TabItem: TTCItem; ImageList: HWND; bNewChangePasswd, bExit : HWND; procedure ShutDown; begin DeleteObject(hFont); UnRegisterClass('MyFormClass', hInst); ExitProcess(hInst); end; function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; var hbrBackGnd: HBRUSH; begin case Msg of WM_COMMAND: if (lParam = bExit) and (HiWord(wParam) = BN_CLICKED) then halt; WM_DESTROY: ShutDown; WM_ENDSESSION: if wParam = 1 then ShutDown; ////////////////////////////////////////////////////////////////////////////// /// КАК ПРАВИЛЬНО ОБРАБАТЫВАТЬ????? ИЛИ МОЖЕТ БЫТЬ НУЖНО ОБРАБАТЫВАТЬ WM_PAINT?????????? ////////////////////////////////////////////////////////////////////////////// WM_CTLCOLORSTATIC: if lParam <> cRunWithWindows then begin hbrBackGnd := GetStockObject(NULL_BRUSH); Result := hbrBackGnd; exit; end; ////////////////////////////////////////////////////////////////////////////// end; Result := DefWindowProc(hwnd, msg, wparam, lparam); end; begin hInst := GetModuleHandle(nil); with WinClass do begin Style := CS_PARENTDC; hIcon := LoadIcon(hInst, PChar('MAINICON')); lpfnWndProc := @WindowProc; hInstance := hInst; hbrBackground := COLOR_BTNFACE + 1; lpszClassName := 'MyFormClass'; hCursor := LoadCursor(0, IDC_ARROW); end; InitCommonControls; RegisterClass(WinClass); // Создание главного окна программы Handle := CreateWindowEx(0, 'MyFormClass', 'Настройки программы', WS_VISIBLE or WS_SYSMENU, 320, 230, 330, 312, 0, 0, hInst, nil); // Создание шрифта hFont := CreateFont(-11, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif'); // Создание ImageList для TabSheet ImageList := ImageList_Create(16, 16, ILC_COLOR32 or ILC_MASK, 10, 10); ImageList_AddIcon(ImageList, LoadIcon(hInstance, 'Z0')); ImageList_AddIcon(ImageList, LoadIcon(hInstance, 'Z1')); // Создание TabSheet TabSheet := CreateWindow(WC_TABCONTROL, '', WS_CHILD or WS_VISIBLE, 2, 0, 320, 227, Handle, TabSheet, hInst, nil); SendMessage(TabSheet, WM_SETFONT, hFont, 0); SendMessage(TabSheet, TCM_SETIMAGELIST, 0, ImageList); // Создание вкладок на TabSheet TabItem.mask := TCIF_TEXT or TCIF_IMAGE; TabItem.pszText := 'Пароль'; TabItem.cchTextMax := 0; TabItem.iImage := 0; SendMessage(TabSheet, TCM_INSERTITEM, 0, longint(@TabItem)); TabItem.iImage := 1; TabItem.pszText := 'Горячие клавиши'; SendMessage(TabSheet, TCM_INSERTITEM, 1, longint(@TabItem)); // Создание надписи Label1 := CreateWindow('Static', 'Старый пароль:', WS_CHILD or SS_NOTIFY or SS_LEFT or WS_VISIBLE, 8, 24, 80, 13, Handle, 0, hInst, nil); SendMessage(Label1, WM_SETFONT, hFont, 0); // Создание надписи Label2 := CreateWindow('Static', 'Новый пароль:', WS_CHILD or SS_NOTIFY or SS_LEFT or WS_VISIBLE, 8, 64, 76, 13, Handle, 0, hInst, nil); SendMessage(Label2, WM_SETFONT, hFont, 0); // Создание надписи Label3 := CreateWindow('Static', 'Повторить новый пароль:', WS_CHILD or SS_NOTIFY or SS_LEFT or WS_VISIBLE, 8, 104, 131, 13, Handle, 0, hInst, nil); SendMessage(Label3, WM_SETFONT, hFont, 0); // Создание надписи Label4 := CreateWindow('Static', 'Подсказка к паролю:', WS_CHILD or SS_NOTIFY or SS_LEFT or WS_VISIBLE, 8, 160, 109, 13, Handle, 0, hInst, nil); SendMessage(Label4, WM_SETFONT, hFont, 0); // Создание надписи Label5 := CreateWindow('Static', 'Статус:', WS_CHILD or SS_NOTIFY or SS_LEFT or WS_VISIBLE, 8, 144, 37, 13, Handle, 0, hInst, nil); SendMessage(Label5, WM_SETFONT, hFont, 0); // Создание надписи Label6 := CreateWindow('Static', 'Label6', WS_CHILD or SS_NOTIFY or SS_LEFT or WS_VISIBLE, 160, 24, 154, 197, Handle, 0, hInst, nil); SendMessage(Label6, WM_SETFONT, hFont, 0); // Создание Edit'a Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE, 8, 38, 145, 21, Handle, 0, hInst, nil); SendMessage(Edit1, WM_SETFONT, hFont, 0); // Создание Edit'a Edit2 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE, 8, 80, 145, 21, Handle, 0, hInst, nil); SendMessage(Edit2, WM_SETFONT, hFont, 0); // Создание Edit'a Edit3 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE, 8, 120, 145, 21, Handle, 0, hInst, nil); SendMessage(Edit3, WM_SETFONT, hFont, 0); // Создание Edit'a Edit4 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE, 8, 176, 145, 21, Handle, 0, hInst, nil); SendMessage(Edit4, WM_SETFONT, hFont, 0); // Создание кнопки для создания/изменение пароля bNewChangePasswd := CreateWindow('Button', 'Создать/Изменить пароль', WS_CHILD or BS_TEXT or WS_VISIBLE, 8, 200, 145, 21, Handle, bNewChangePasswd, hInst, nil); SendMessage(bNewChangePasswd, WM_SETFONT, hFont, 0); // Создание checkbox'a для дообавления программы в автозапуск Windows cRunWithWindows := CreateWindow('Button', 'Запуск вместе с Windows', WS_CHILD or BS_AUTOCHECKBOX or WS_VISIBLE, 4, 230, 153, 17, Handle, 0, hInst, nil); SendMessage(cRunWithWindows, WM_SETFONT, hFont, 0); // Создание кнопки для закрытия окна bExit := CreateWindow('Button', 'Закрыть', WS_CHILD or BS_TEXT or WS_VISIBLE, 4, 252, 316, 21, Handle, bExit, hInst, nil); SendMessage(bExit, WM_SETFONT, hFont, 0); while(GetMessage(Msg, 0, 0, 0)) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end. Помогите, почему заливки не совпадают на TabSheet и всех Static'ах? Подключаю исходники, только помогите! Прикреплённый файл ![]() |
![]() |
Сообщ.
#11
,
|
|
Е-мае... ты тоже не знаешь, что э.у. на вкладках по хорошему должны лежать на диалогах-страничках?
|
Сообщ.
#12
,
|
|
|
Цитата B.V. @ Е-мае... ты тоже не знаешь, что э.у. на вкладках по хорошему должны лежать на диалогах-страничках? Я немного не понял. Что ты имеешь в виду? Поясни. |
![]() |
Сообщ.
#13
,
|
|
Сначала создавай диалог без рамки, затем создавай static'и и прочие э.у. на нем, и затем делай этот диалог дочерним окну-родителю TabControl'а. Для того, что бы вкладка была затекстурена в соответствии с темой (Аеро или ХР-темой), вызови в конце EnableThemeDialogTexture для диалога-странички.
|
Сообщ.
#14
,
|
|
|
Цитата B.V. @ Сначала создавай диалог без рамки, затем создавай static'и и прочие э.у. на нем, и затем делай этот диалог дочерним окну-родителю TabControl'а. Для того, что бы вкладка была затекстурена в соответствии с темой (Аеро или ХР-темой), вызови в конце EnableThemeDialogTexture для диалога-странички. Ну в общих чертах понятно. Только вот хотелось бы это в коде увидеть... Добавлено Да. и где находится EnableThemeDialogTexture? |
![]() |
Сообщ.
#15
,
|
|
Цитата DemonXpPro @ Только вот хотелось бы это в коде увидеть... Ну, вот тебе в коде: http://code.google.com/p/easybar/source/browse/trunk/FilePropDlg.cpp Цитата DemonXpPro @ Да. и где находится EnableThemeDialogTexture? В Дельфи? Понятия не имею. Добавлено Заглянул в Дельфи, оказывается, у них есть подраздел Дельфи WinAPI. А в подразделе твой дубль Чито WinAPI Нехорошо получается |