2012-05-14 3 views
0

Я хотел бы создать окно редактирования с закругленными краями. Я не могу использовать стандартный элемент управления полем, поскольку он нарисовал прямоугольную область редактирования.Как создать пользовательский контроль формы в win32 C++

Любые предложения или указатели, как это сделать?

ответ

3

У вас есть несколько вариантов: -

  1. Создать родительский контроль и иметь ребенок без рамки управления редактирования текста внутри него
  2. Подкласса управления редактированием текста и перегружать NC_PAINT нарисовать границу

ОБНОВЛЕНИЕ

После того, как возиться с программой образца, она постепенно рассветал на мне, что элементы управления редактированием подкласса не работают, и проверка он-лайн подтверждает это (благодарю MS за то, что вы так последовательны!).

Так что просто оставляет вариант 1 и вариант 3 (только мысль об этом):

  1. Создать свой собственный контроль редактировать

Вот пример метода 1:

#include <windows.h> 

LRESULT __stdcall EditboxProc (HWND window, unsigned message, WPARAM w_param, LPARAM l_param) 
{ 
    bool 
    use_default = true; 

    LRESULT 
    result = 0; 

    switch (message) 
    { 
    case WM_CREATE: 
    { 
     RECT 
     client; 

     GetClientRect (window, &client); 

     HWND 
     edit = CreateWindowEx (0, 
           TEXT ("Edit"), 
           0, 
           WS_VISIBLE | WS_CHILD, 
           10, 
           10, 
           client.right - 20, 
           client.bottom - 20, 
           window, 
           0, 
           GetModuleHandle (0), 
           0); 

     SetWindowLongPtr (window, GWLP_USERDATA, static_cast <LONG> (reinterpret_cast <LONG_PTR> (edit))); 
    } 
    break; 

    case WM_SIZE: 
    { 
     RECT 
     client; 

     GetClientRect (window, &client); 
     SetWindowPos (reinterpret_cast <HWND> (static_cast <LONG_PTR> (GetWindowLongPtr (window, GWLP_USERDATA))), 0, 10, 10, client.right - 20, client.bottom - 20, SWP_NOZORDER | SWP_NOOWNERZORDER); 

     use_default = false; 
    } 
    break; 
    } 

    return use_default ? DefWindowProc (window, message, w_param, l_param) : result; 
} 

LRESULT __stdcall WindowProc (HWND window, unsigned message, WPARAM w_param, LPARAM l_param) 
{ 
    bool 
    use_default = true; 

    LRESULT 
    result = 0; 

    switch (message) 
    { 
    case WM_CREATE: 
    { 
     RECT 
     client; 

     GetClientRect (window, &client); 

     CreateWindowEx (0, 
         TEXT ("EditboxClass"), 
         0, 
         WS_VISIBLE | WS_CHILD, 
         client.right/4, 
         client.bottom/2 - 20, 
         client.right/2, 
         40, 
         window, 
         0, 
         GetModuleHandle (0), 
         0); 
    } 
    break; 
    } 

    return use_default ? DefWindowProc (window, message, w_param, l_param) : result; 
} 

int __stdcall WinMain (HINSTANCE instance, HINSTANCE prev_instance, LPSTR command_line, int show) 
{ 
    WNDCLASSEX 
    window_class = 
    { 
     sizeof window_class, 
     0, 
     WindowProc, 
     0, 
     0, 
     instance, 
     0, 
     0, 
     reinterpret_cast <HBRUSH> (static_cast <int> (COLOR_WINDOW) + 1), 
     0, 
     TEXT ("WindowClass"), 
     0 
    }, 
    editbox_class = 
    { 
     sizeof editbox_class, 
     0, 
     EditboxProc, 
     0, 
     0, 
     instance, 
     0, 
     0, 
     reinterpret_cast <HBRUSH> (static_cast <int> (COLOR_BTNFACE) + 1), 
     0, 
     TEXT ("EditboxClass"), 
     0 
    }; 

    if (RegisterClassEx (&window_class) && RegisterClassEx (&editbox_class)) 
    { 
    HWND 
     window = CreateWindowEx (0, 
           TEXT ("WindowClass"), 
           TEXT ("Demo"), 
           WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
           CW_USEDEFAULT, 
           CW_USEDEFAULT, 
           CW_USEDEFAULT, 
           CW_USEDEFAULT, 
           0, 
           0, 
           instance, 
           0); 

    if (window) 
    { 
     MSG 
     message; 

     bool 
     quit = false; 

     while (!quit) 
     { 
     switch (GetMessage (&message, window, 0, 0)) 
     { 
     case -1: 
     case 0: 
      quit = true; 
      break; 

     default: 
      TranslateMessage (&message); 
      DispatchMessage (&message); 
      break; 
     } 
     } 
    } 
    } 

    return 0; 
} 

Это немного голые кости, но вы должны дать вам некоторое представление о том, как делать то, что вы хотите. Он не будет работать с диалоговыми окнами, определенными с использованием сценариев ресурсов (я думаю, прошло некоторое время с тех пор, как я вручную закодировал ресурс), поскольку он использует настраиваемый элемент управления для родителя окна редактирования (вещь, которая отображает фрейм). Вероятно, вы захотите добавить обработчики в EditboxProc для обработки переданного сообщения в элемент управления редактирования (например, WM_NOTIFY, WM_COMMAND, WM_GETTEXT и т. Д.) И для отображения округлых углов (WM_PAINT, WM_ERASEBKGND).

+0

это возможно, если вы можете указать на какой-то пример или какой-нибудь хороший ресурс – anand

+0

@ Alien01: Мне нечего показать, и я ничего не могу найти в Интернете. Я посмотрю, смогу ли я что-нибудь сбить. – Skizz

+0

@ Alien01: Что-то связанное вместе .... – Skizz