Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2013, 19:48   #1
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию Tabs

Всем привет! Пытаюсь разобраться с вкладками. вот код
Код:
.....
void AddItemToTab(TCHAR *p, int item, HWND tab)
{
	TCITEM tci;
	tci.pszText = p;
	TabCtrl_InsertItem(tab,item,(const TCITEM*)&tci);
	TabCtrl_SetItem(tab,item,(const TCITEM*)&tci);
}
.....
// Создаём вкладки
	hTabs = CreateWindow(WC_TABCONTROL,
					NULL,
					WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE,
					10,
					100,
					220, // Ширина
					244, // Высота
					hWnd,
					(HMENU)NULL,
					GetModuleHandle(NULL),
					NULL);

	AddItemToTab(TEXT("CPU"), 1, hTabs);
	AddItemToTab(TEXT("GPU"), 2, hTabs);
	AddItemToTab(TEXT("RAM"), 3, hTabs);
	AddItemToTab(TEXT("Soft"), 4, hTabs);

	// Показываем окно
	ShowWindow(hWnd, SW_NORMAL);
	UpdateWindow(hWnd);
Вкладки появляются, но без текста(названий). В чём моя ошибка?

Последний раз редактировалось hvz-; 11.03.2013 в 19:50.
hvz- вне форума Ответить с цитированием
Старый 11.03.2013, 21:00   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

В TCITEM есть поле mask - прочитайте и пропишите что нужно.
waleri вне форума Ответить с цитированием
Старый 11.03.2013, 22:08   #3
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
В TCITEM есть поле mask - прочитайте и пропишите что нужно.
Спасибо большое, помогло!
Для тех кому надо: tci.mask = TCIF_TEXT <- этот флаг указывает то нужно изменить(в данном случае текст вкладки), подробнее тут.

И ещё вопрос - как поставить нормальный шрифт? А то всё жирным и большими буквами.
Манифест прописан:
Код:
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
hvz- вне форума Ответить с цитированием
Старый 12.03.2013, 06:02   #4
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Вопрос со шрифтом решён, инфа тут.

А как тогда текст прикручивать к определённой вкладке в моём случае? Если через SendMessage() то как обращаться к определённому элементу в дескрипторе hTabs?

И как можно убрать эти серые места?
hvz- вне форума Ответить с цитированием
Старый 12.03.2013, 08:39   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Когда меняется вкладка приходит сообщение.
Читайте про WM_NOTIFY и TCN_SELCHANGE.
Ну а дальше показывайте что надо и как надо...
waleri вне форума Ответить с цитированием
Старый 12.03.2013, 16:44   #6
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Когда меняется вкладка приходит сообщение.
Читайте про WM_NOTIFY и TCN_SELCHANGE.
Ну а дальше показывайте что надо и как надо...
Т.е. придётся всегда прорисовывать текст в определённой вкладке при её смене? Это как то накладно что ли
Может есть другой вариант? Возможно нужно сделать пару отдельных дескрипторов для каждой вкладки? Если меня научат "соединять" их в один ряд, а то это была моя первая мысль по поводу вкладок)
hvz- вне форума Ответить с цитированием
Старый 13.03.2013, 08:51   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Вариантов туева хуча - я же не знаю что вам надо. Я вам говорю, что есть сигнал что изменилась вкладка а как вы на него будете реагировать это дело хозяйское...

Я бы начал с примера, полно таких диалогов... http://www.codeproject.com/Articles/...roperty-Sheets
waleri вне форума Ответить с цитированием
Старый 19.03.2013, 16:59   #8
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вариантов туева хуча - я же не знаю что вам надо.
Так мне надо что бы в каждой вкладке находились определённые контролы - будь то текст, кнопка и т.д.

Цитата:
Сообщение от waleri Посмотреть сообщение
Я вам говорю, что есть сигнал что изменилась вкладка а как вы на него будете реагировать это дело хозяйское...
А можете пример дать в соотв. с моим кодом? А то перерыл кучу инфы - то с MFC то вообще непонятно как. Дело в том, что я в WinAPI новичёк, и самому разобраться бывает достаточно сложно.

И насчёт этих серых полей в контролах - как их убрать? Менял цвет как и главного окна так и самих контролов - не помогает.

UPD:
Разобрался с обработкой сообщений:
Код:
 ...
switch(uMsg)
    {
		case WM_NOTIFY:
			{
				case TCN_SELCHANGE:
					//int hTabs = TabCtrl_GetCurSel(hWnd);
					DrawCpuTab(hTabs);
					MessageBox(hWnd, TEXT("TCN_SELCHANGE works!"), TEXT("Hell yeah!"), MB_OK);
			}
...
Но функция DrawCpuTab(hTabs); не работает т.к. hTabs - это дескриптор моих закладок. Само определение дескриптора расположено в другом файле, котором весь дизайн(создание окна и контролов), а функция DrawCpuTab(hTabs); в другом файле, вот её тело:
Код:
void DrawCpuTab(HWND *hTab)
{
	HFONT hFont;
	hFont = CreateFont(13, 0, 0, 0, FW_MEDIUM, FALSE, FALSE, FALSE, ANSI_CHARSET, 
	OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Tahoma"));

	HWND hText;
	hText = CreateWindow(TEXT("static"),
						TEXT("Windows build"),
						WS_OVERLAPPED | WS_CHILD | WS_VISIBLE,
						15, 
						25, 
						70, // width
						30, // heigth
						*hTab, 
						(HMENU)NULL,
						GetModuleHandle(NULL), 
						NULL); // Создаём текст
	SendMessage(hText, WM_SETFONT, (WPARAM)hFont, TRUE);
}
Пытался вынести дескриптор закладок в глобальные переменные(в том же файле, просто вывел из функции вверх) - не помогает.
сам файл инклудится перед началом функции WinMain.
Может есть функции которые помогают определять закладки в окне?

Последний раз редактировалось hvz-; 19.03.2013 в 18:26.
hvz- вне форума Ответить с цитированием
Старый 22.03.2013, 04:35   #9
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Вобщем вынес все используемые в разных функциях/файлах дескрипторы контролов в отдельный файл и проинклудил их в другие файлы. Но моя функция не вызывается:
Код:
case WM_NOTIFY:
			{
				case TCN_SELCHANGE:
					int tab = 0;
					tab = TabCtrl_GetCurSel(hTabs);
					switch(tab)
					{
						case 0:
							MessageBox(hWnd, TEXT("FUNKCIJA NE RABOTAET"), TEXT("A VOT"), MB_OK);
							break;
						case -1:
							MessageBox(hWnd, TEXT("OSHIBKA"), TEXT("A VOT"), MB_OK);
							break;
						case 1:
							CpuTab();
							break;
						case 2:
							break;
						case 3:
							break;
						case 4:
							break;
						case 5:
							break;
						default:
							MessageBox(hWnd, TEXT("FIG"), TEXT("A VOT"), MB_OK);
							break;
					}
			}
и почему то функция моя не вызывается, т.е. переменная tabне изменилась и равна 0. Может это всё из за того, что вынес дескрипторыв другой файл и сделал их глобальными? Вот содержание самого файла дескрипторов:
Код:
#include <windows.h>

static HWND hWnd;  // Главное окно
static HWND hTabs; // Вкладки
Так же прилагаю сам проект.
Умоляю, посмотрите пожалуйста проект и помогите нубу разобраться, а то скоро работу сдавать а я ещё на дизайне застрял.
hvz- вне форума Ответить с цитированием
Старый 22.03.2013, 14:19   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Код:
		case WM_NOTIFY:
			{
				case TCN_SELCHANGE:
Тут как бы нужен второой switch
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл по Tabs в TabControl Shouldercannon Общие вопросы Delphi 3 12.12.2012 13:37
jquery ui tabs Hey4 JavaScript, Ajax 1 02.03.2012 23:15
Tabs-меню. Как это реализовано (ссылка на образец)? akokin HTML и CSS 3 14.10.2009 15:36