Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tab Control, Как опред. коорд. области под закладками 
V
    Опции темы
586
Дата 8.8.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Как определить координаты области под закладками в Tab Control'е?
PM   Вверх
Romikgy
Дата 9.8.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Мож это TCM_ADJUSTRECT, не совсем понятно что хочешь?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
586
Дата 9.8.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(Romikgy @  9.8.2006,  11:09 Найти цитируемый пост)
TCM_ADJUSTRECT

Код
#include <windows.h>
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")

int __stdcall MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, long lParam)
{
    if(uMsg==WM_CLOSE) EndDialog(hWnd, 0);
    else if(uMsg==WM_INITDIALOG)
    {
        RECT r;
        TCITEM tci;
        tci.mask=TCIF_TEXT;
        tci.pszText="Page 1";
        SendDlgItemMessage(hWnd, 100, TCM_INSERTITEM, 0, (long)&tci);
        tci.pszText="Page 2";
        SendDlgItemMessage(hWnd, 100, TCM_INSERTITEM, 1, (long)&tci);
        SendDlgItemMessage(hWnd, 100, TCM_ADJUSTRECT, 0, (long)&r);
        SetWindowPos(GetDlgItem(hWnd, 150), 0, r.left, r.top, r.right, r.bottom, 0);
        _asm int 3
    }
    return 0;
}

int __stdcall WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, INT)
{
    InitCommonControls();
    DialogBoxParam(hinst, (char*)1000, 0, MainWndProc, 0);
    return 0;
}

Что я не так делаю? На брейкпойнте отладчик показывает вот что:
Цитата
r    {top=-858993438 bottom=-858993464 left=-858993456 right=-858993464}


PM   Вверх
Earnest
Дата 9.8.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Что передаешь, то и получаешь.
Ты должен инициализировать rc. Заглянул бы в MSDN насчет TCM_ADJUSTRECT.
Цитата

fLarger (wParam)
Operation to perform. If this parameter is TRUE, prc specifies a display rectangle and receives the corresponding window rectangle. If this parameter is FALSE, prc specifies a window rectangle and receives the corresponding display area. 
prc (lParam)
Pointer to a RECT structure that specifies the given rectangle and receives the calculated rectangle. 



--------------------
...
PM   Вверх
586
Дата 9.8.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Earnest, просто у меня с английским туговато.

Сейчас у меня контрол (150) по длине не вписывается в TabControl (100) пикселей на 10.
Код
int __stdcall MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, long lParam)
{
    if(uMsg==WM_CLOSE) EndDialog(hWnd, 0);
    else if(uMsg==WM_INITDIALOG)
    {
        RECT r={0, 0, 0, 0};
        WINDOWPLACEMENT wp;
        TCITEM tci;
        tci.mask=TCIF_TEXT;
        tci.pszText="Page 1";
        SendDlgItemMessage(hWnd, 100, TCM_INSERTITEM, 0, (long)&tci);
        tci.pszText="Page 2";
        SendDlgItemMessage(hWnd, 100, TCM_INSERTITEM, 1, (long)&tci);
        SendDlgItemMessage(hWnd, 100, TCM_ADJUSTRECT, 0, (long)&r);
        GetWindowPlacement(GetDlgItem(hWnd, 100), &wp);
        wp.rcNormalPosition.left+=r.left;
        wp.rcNormalPosition.top+=r.top;
        wp.rcNormalPosition.right+=r.right-r.left;
        wp.rcNormalPosition.bottom+=r.bottom-r.top;
        SetWindowPos(GetDlgItem(hWnd, 150), 0, wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom, 0);

    }
    return 0;
}

Что я опять не так делаю  smile 
PM   Вверх
bel_nikita
Дата 9.8.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 4
Всего: 47





--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 9.8.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(586 @  9.8.2006,  15:05 Найти цитируемый пост)
просто у меня с английским туговато.

Так ты далеко не уедешь... Учи.
Ладно.
Это сообщение конвертирует клиентский прямоугольник (display area) в оконный и обратно, в зависимости от флага, который передается в wParam. 
Если wParam==TRUE, в rc нужно поместить координаты display area (т.е. твоего контрола), а получишь назад - оконные координаты tab-controла. Или можно наоборот: для заданного размера tab-контрола получить размеры его клиентской части.

Ты мог бы сам догадаться, что нигде не используешь желаемый размер своего контрола



--------------------
...
PM   Вверх
586
Дата 9.8.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Код
int __stdcall MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, long lParam)
{
    if(uMsg==WM_CLOSE) EndDialog(hWnd, 0);
    else if(uMsg==WM_INITDIALOG)
    {
        RECT r={0, 0, 0, 0};
        WINDOWPLACEMENT wp;
        TCITEM tci;
        tci.mask=TCIF_TEXT;
        tci.pszText="Page 1";
        SendDlgItemMessage(hWnd, 100, TCM_INSERTITEM, 0, (long)&tci);
        tci.pszText="Page 2";
        SendDlgItemMessage(hWnd, 100, TCM_INSERTITEM, 1, (long)&tci);
        GetWindowPlacement(GetDlgItem(hWnd, 100), &wp);
        SendDlgItemMessage(hWnd, 100, TCM_ADJUSTRECT, 0, (long)&wp.rcNormalPosition);
        SetWindowPos(GetDlgItem(hWnd, 150), 0, wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom, 0);
    }
    return 0;
}


Почему контрол не вписывается в ToolBar???????

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  test3.rar 34,25 Kb
PM   Вверх
MoZy
Дата 9.8.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: 1
Всего: 0



586, может потому что в SetWindowPos ты вместо размера указываешь нижний левый угол

Цитата

SetWindowPos(GetDlgItem(hWnd, 150), 0, wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom, 0);


--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 9.8.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(MoZy @  9.8.2006,  20:22 Найти цитируемый пост)
может потому что в SetWindowPos ты вместо размера указываешь нижний левый угол

Точно!! А я думал, что right и bottom - это длина и ширина.
Всем спасибо.

Это сообщение отредактировал(а) 586 - 9.8.2006, 20:26
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.