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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текст, WinAPI без MFC без ресурсов 
V
    Опции темы
Belous
Дата 15.12.2015, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите, пожалуйста, как установить порядок полей статик, для ясности показал на рисунке. Проект прилагаю.


Это сообщение отредактировал(а) Belous - 15.12.2015, 21:30

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Pic1.PNG 14,95 Kb
PM MAIL   Вверх
Belous
Дата 15.12.2015, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проект

Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  Test.rar 142,08 Kb
PM MAIL   Вверх
Belous
Дата 15.12.2015, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



PS Задача на мой взгляд не сложная (код взял из книги Петзольда с изменениями), но неожиданно надпись Test залезла под белое поле static ... Не понятно почему, ведь поле создается в первую очередь, а надпись должна быть на поле.

Добавлено через 14 минут и 2 секунды
Часть кода где, возможно, зарыта ошибка

Код

void About::ShowDlg(HWND hwnd, HINSTANCE hinstance)
{
    HWND habout, hpicture;
    POINT point;
    RECT rect;
    DWORD dwStyle;
    HDC hdc;
    HFONT hFont;
    EnableWindow(hwnd, FALSE);
    //
    dwStyle = WS_POPUPWINDOW | WS_CAPTION;
    habout = CreateWindowEx(0, IDC_ABOUT, " About", dwStyle, 0, 0, 0, 0, hwnd, NULL, hinstance, NULL);
    GetWindowRect(hwnd, &rect);
    point.x = (long) (rect.left + (rect.right - rect.left - IDC_ABOUT_WIDTH) / 2);
    point.y = (long) (rect.top + (rect.bottom - rect.top - IDC_ABOUT_HEIGHT) / 2);
    MoveWindow(habout, point.x, point.y, IDC_ABOUT_WIDTH, IDC_ABOUT_HEIGHT, FALSE);
    ShowWindow(habout, SW_SHOW);
    //
    dwStyle = WS_CHILD | WS_VISIBLE | SS_WHITERECT;
    hpicture = CreateWindowEx(0, "static", 0, dwStyle, 0, 0, 300, 48, habout, NULL, hinstance, NULL);
    ShowWindow(hpicture, SW_SHOW);
    //
    char szText[] = "T e s t";
    hdc = GetDC(hpicture);
    hFont = EasyCreateFont(hdc, "Times New Roman", 20, 0, 1, TRUE);
    SelectObject(hdc, hFont);
    TextOut(hdc, 10, 35, szText, strlen(szText));
    ReleaseDC(hpicture, hdc);
    DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
}

HFONT EasyCreateFont(HDC hdc, char * szFaceName, int iPtHeight, int iPtWidth, int iparam, BOOL flag)
{
    FLOAT cxDpi, cyDpi;
    HFONT hFont;
    LOGFONT lf;
    POINT point;
    TEXTMETRIC tm;
    SaveDC(hdc);
    SetGraphicsMode(hdc, GM_ADVANCED);
    ModifyWorldTransform(hdc, NULL, MWT_IDENTITY);
    SetViewportOrgEx(hdc, 0, 0, NULL);
    SetWindowOrgEx(hdc, 0, 0, NULL);
    if (flag) 
    {
        cxDpi = (FLOAT) GetDeviceCaps(hdc, LOGPIXELSX);
        cyDpi = (FLOAT) GetDeviceCaps(hdc, LOGPIXELSY);
    }
    else
    {
        cxDpi = (FLOAT) (25.4 * GetDeviceCaps(hdc, HORZRES) / GetDeviceCaps(hdc, HORZSIZE));
        cyDpi = (FLOAT) (25.4 * GetDeviceCaps(hdc, VERTRES) / GetDeviceCaps(hdc, VERTSIZE));
    }
    point.x = (int) ((iPtWidth * 10.0)  * cxDpi / 72);
    point.y = (int) ((iPtHeight * 10.0) * cyDpi / 72);
    DPtoLP(hdc, &point, 1);
    lf.lfHeight            = - (int) (abs(point.y) / 10.0 + 0.5);
    lf.lfWidth            = 0;
    lf.lfEscapement        = 0;
    lf.lfOrientation    = 0;
    lf.lfWeight            = iparam & 1 ? 700 : 0;
    lf.lfItalic            = iparam & 2 ?   1 : 0;
    lf.lfUnderline        = iparam & 4 ?   1 : 0;
    lf.lfStrikeOut        = iparam & 8 ?   1 : 0;
    lf.lfCharSet        = 0;
    lf.lfOutPrecision    = 0;
    lf.lfClipPrecision    = 0;
    lf.lfQuality        = 0;
    lf.lfPitchAndFamily = 0;
    strcpy(lf.lfFaceName, szFaceName);
    hFont = CreateFontIndirect(&lf);
    if (iPtWidth != 0)
    {
        hFont = (HFONT) SelectObject(hdc, hFont);
        GetTextMetrics(hdc, &tm);
        DeleteObject(SelectObject(hdc, hFont));
        lf.lfWidth = (int) (tm.tmAveCharWidth * abs(point.x) / abs(point.y) + 0.5);
        hFont = CreateFontIndirect(&lf);
    }
    RestoreDC(hdc, -1);
    return hFont;
}


Это сообщение отредактировал(а) Belous - 15.12.2015, 21:28
PM MAIL   Вверх
GremlinProg
Дата 16.12.2015, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Все логично. Вы создали статик и нарисовали на нем надпись. И все это сделали в одном и том же методе About::ShowDlg. Теперь, когда статику пришло сообщение WM_PAINT, он обновил себя и нарисовал прямоугольник поверх текста, который Вы нарисовали.

Рисование на холсте заданного окна должно быть в рамках сообщения WM_PAINT, которое система периодически посылает этому окну. Почитайте про сабклассинг, это поможет Вам внедрить свою процедуру отрисовки окна в этот статик.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Belous
Дата 20.12.2015, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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


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

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


 




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


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

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