Диалог или Окно?

 
0
 
C++
ava
Leksey | 12.12.2004, 18:59
 Простите за нескромный вопрос:
В каком случае лучше использовать диалог, а когда окно?
Что дает регистрация класса окна?
И вообще с диалогами бысрее и легче работать, но используются окна.  
Ответы (15)
ava
Coocky | 12.12.2004, 21:51 #
 
Цитата
В каком случае лучше использовать диалог, а когда окно?


Диалог и есть окно...
Диалог для того и предназначен-вести диалог с пользователем.Он не имеет халявного ресайза,поэтому в нормальных прогах не используется как основное окно,а как впомогательное.
Насчет быстроты-не согласен.Вообще такое понятие к окнам недопустимо.Насчет легкости-согласен. 
ava
zhgutov | 14.12.2004, 23:05 #
 
Цитата
Он не имеет халявного ресайза


«Халявный» ресайз, например, при описании в файле ресурсов (стиль окна WS_THICKFRAME):

IDD_DIALOGX DIALOGEX 0, 0, 143, 170
STYLE /* ... | */ WS_THICKFRAME
CAPTION "Sample"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
// ...
END


Кстати, есть резон использовать диалоговое окно в качестве основного в случае, если на нем требуется разместить элементы управления, зависимые от «разрешения» экрана.

Под разрешением здесь подразумевается значение pixels/distance, устанавливаемое в настройках экрана Windows (Display->Settings->Advanced->General). 
ava
Leksey | 14.12.2004, 23:27 #
 А если я буду использовать диологовое окно как основное у простенького текстового редактора в чем будут его недостатки? 
ava
zhgutov | 14.12.2004, 23:48 #
 Не ясно, что представляет собой программа. Какие у нее возможности? Что еще, кроме окна редактирования лежит в клиентской области окна? 
ava
Leksey | 15.12.2004, 00:15 #
 В принципе больше ничего и не лежит в клиентской области окна?(А что например еще может лежать в  клиентской области окна текстового редактора?) 
ava
zhgutov | 15.12.2004, 00:24 #
 Для простой программы разницы особой нет, что использовать. Особенно, если для всего этого написан шаблон.

Цитата
А что например еще может лежать в клиентской области окна текстового редактора?

Другие элементы управления, для конкретной задачи. 
ava
Leksey | 15.12.2004, 00:28 #
 
Цитата
Особенно, если для всего этого написан шаблон.

Можно поподробнее о шаблонах или где о них можно почитать? 
ava
zhgutov | 15.12.2004, 01:03 #
 Говоря о шаблоне я имею в виду что-то вроде:

#include <tchar.h>
#include <windows.h>
#include <windowsx.h>

int _tWinMain (HINSTANCE, HINSTANCE, PTSTR, int)
{
        // ...
}

Метод copy/paste в действии.

Может быть нужен пример? 
ava
Coocky | 15.12.2004, 01:31 #
 
Цитата
Халявный» ресайз, например, при описании в файле ресурсов (стиль окна WS_THICKFRAME):


А элементы на нем? smile  
ava
zhgutov | 15.12.2004, 01:46 #
 
Цитата
А элементы на нем?

А это вопрос второй. 
ava
Coocky | 15.12.2004, 02:09 #
 
Цитата
А это вопрос второй.

Ну так я это и имел,кстати в QT есть... smile А если про стиль,так и ежу понятно smile  
ava
zhgutov | 15.12.2004, 02:39 #
 
Цитата
А если про стиль,так и ежу понятно

Если б автору темы было все понятно, то она не появилась бы ;-) 
ava
Leksey | 15.12.2004, 10:39 #
 
Цитата
Может быть нужен пример?

Я бы был очень благодарен за пример. 
ava
zhgutov | 15.12.2004, 16:24 #
 Вот, например, шаблон программы, создающей главное окно приложения, использующего двойную буферизацию для прорисовки клиентской области:

#include <tchar.h>
#include <windows.h>
#include <windowsx.h>

const TCHAR* CLASS_NAME = _T ("Win32API_template");
const TCHAR* PROGRAM_NAME = _T ("Win32 API (GDI) program template");

HWND h_wnd_main = NULL;

LRESULT CALLBACK wnd_fun (HWND h_wnd, UINT u_msg, WPARAM w_param, LPARAM l_param)
{
    switch (u_msg) {
    case WM_PAINT: // Прорисовка с двойной буферизацией
    {
  PAINTSTRUCT ps;
  HDC h_dc = BeginPaint (h_wnd, &ps);
  HDC h_comp_dc = CreateCompatibleDC (h_dc);

  HBITMAP h_back_buffer = CreateCompatibleBitmap (h_dc, ps.rcPaint.right, ps.rcPaint.bottom);
  HBITMAP h_old_bitmap = SelectBitmap (h_comp_dc, h_back_buffer);

  HBRUSH h_solid_brush = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
  FillRect (h_comp_dc, &ps.rcPaint, h_solid_brush);
  DeleteObject (h_solid_brush);

  // Здесь - код, рисующий в клиентской области на совместимом контексте устройства

  BitBlt (h_dc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom,
    h_comp_dc, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
  SelectBitmap (h_comp_dc, h_old_bitmap), DeleteObject (h_back_buffer);

  DeleteDC (h_comp_dc);
  EndPaint (h_wnd, &ps);
    }
  return 0;
    case WM_GETMINMAXINFO:
  reinterpret_cast <PMINMAXINFO>(l_param)->ptMinTrackSize.x = GetSystemMetrics (SM_CXSCREEN) >> 1;
  reinterpret_cast <PMINMAXINFO>(l_param)->ptMinTrackSize.y = GetSystemMetrics (SM_CYSCREEN) >> 1;
  break;
    case WM_DESTROY:
  PostQuitMessage (0);
  return 0;
    }
    return DefWindowProc (h_wnd, u_msg, w_param, l_param);
}

int WINAPI _tWinMain (HINSTANCE h_instance, HINSTANCE, PTSTR, int cmd_show)
{
    WNDCLASS wc = {
  CS_HREDRAW | CS_VREDRAW | CS_OWNDC, wnd_fun, 0, 0, h_instance,
  LoadIcon (NULL, IDI_APPLICATION), LoadCursor (NULL, IDC_ARROW), NULL, NULL, CLASS_NAME
    };
    if (!RegisterClass (&wc) || !(h_wnd_main = CreateWindowEx (WS_EX_CLIENTEDGE, CLASS_NAME,
    PROGRAM_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, h_instance, NULL))) {
  MessageBox (NULL, _T ("Ошибка при создании главного окна; программа будет завершена"),
    PROGRAM_NAME, MB_OK | MB_ICONERROR);
  return 1;
    }

    ShowWindow (h_wnd_main, cmd_show);
    UpdateWindow (h_wnd_main);

    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0)) {
  TranslateMessage (&msg);
  DispatchMessage (&msg);
    }

    return 0;
}
 
Добавлено позднее:
А регистрация класса окна — это примерно то же, что создание класса в C++. Регистрируя класс окна, пользователь получает возможность создания множества однотипных окон, в т.ч. с одной и той же оконной функцией.

Аналогия — создание какого-либо элемента управления. Скажем, банальная кнопка имеет класс «button». 
ava
Leksey | 15.12.2004, 23:56 #
 Большой thank за пример  zhgutov 
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Coocky   Leksey   zhgutov
advanced
Отправить