Окно с изменяемым размером без бордюра

Тема в разделе "WASM.WIN32", создана пользователем elimli, 25 май 2007.

  1. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    kero
    Поведение кнопки-крестика.
    Если ее нажать мышкой она "утОпнет", если курсор мышки убрать "всплывет", если навести курсор снова "утОпнет", если нажать на "утОпленную" приложение закроется. Если "утопить", затем ткнуть мышкой куда-нибудь мимо крестика, то при наведении крестик уже не "утоплен".
    Так задумано?
     
  2. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Цель была - WS_SYSMENU, а сопутствующие артефакты, каюсь, были пофигу :)
    Если раздражает - поправить легко. Например, добавив такой фрагментик:
    ...
    .elseif dx==WM_LBUTTONDOWN
    .if cx==HTCLOSE
    mov uMsg,edx
    jmp @f
    .endif

    .if eax==13h
    ...
     
  3. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Вот мой код. Не на ассемблере. Извиняюсь за "многословность" кода - не могу иначе. Обработки WM_SETCURSOR нет. Кнопка закрытия там где надо - в правой стороне - не нарисована только, но если подвести курсор и подождать - видим Tooltip. Углы окна тоже не обработаны для resize, но это только добавит кода. Принцип ясен - мне кажется.
    Код (Text):
    1. #include <Windows.h>
    2.  
    3. // -------------------------------------------------------------------------
    4. #define BORDER_WIDTH        10
    5. #define CAPTION_HEIGHT      16
    6. #define _3D_BORDER_RAISED       TRUE
    7. #define _3D_BORDER_PUSHED       FALSE
    8.  
    9. // -------------------------------------------------------------------------
    10. void Draw3DRect (HDC hDC, RECT& area, BOOL bRaised)
    11. {
    12.     HGDIOBJ hDefaultPen = SelectObject (hDC, GetStockObject (WHITE_PEN));
    13.  
    14.     HPEN dark_gray = CreatePen (PS_SOLID, 1, RGB (128, 128, 128));
    15.     HPEN white = (HPEN) GetStockObject (WHITE_PEN);
    16.  
    17.     HPEN left_top = dark_gray;
    18.     HPEN right_bottom = white;
    19.  
    20.     if (bRaised)
    21.     {
    22.         left_top = white;
    23.         right_bottom = dark_gray;
    24.     }
    25.  
    26.     int x2 = area.right - 1;
    27.     int y2 = area.bottom - 1;
    28.  
    29.     SelectObject (hDC, left_top);
    30.     MoveToEx (hDC, area.left, area.top, NULL);
    31.     LineTo (hDC, area.left, y2);
    32.     MoveToEx (hDC, area.left, area.top, NULL);
    33.     LineTo (hDC, x2, area.top);
    34.  
    35.     SelectObject (hDC, right_bottom);
    36.     MoveToEx (hDC, x2, y2, NULL);
    37.     LineTo (hDC, area.left, y2);
    38.     MoveToEx (hDC, x2, y2, NULL);
    39.     LineTo (hDC, x2, area.top);
    40.  
    41.     SelectObject (hDC, hDefaultPen);
    42.     DeleteObject (dark_gray);
    43. }
    44.  
    45. // -------------------------------------------------------------------------
    46. void OnPaint (HWND hWnd)
    47. {
    48.     PAINTSTRUCT ps;
    49.     HDC hDC = BeginPaint (hWnd, &ps);
    50.  
    51.     RECT client;
    52.     RECT interior;
    53.  
    54.     HBRUSH marine = CreateSolidBrush (RGB (0, 64, 128));
    55.     HBRUSH silver = (HBRUSH) GetStockObject (LTGRAY_BRUSH);
    56.  
    57.     GetClientRect (hWnd, &client);
    58.     interior = client;
    59.     InflateRect (&interior, -BORDER_WIDTH, -BORDER_WIDTH);
    60.  
    61.     FillRect (hDC, &client, silver);
    62.     FrameRect (hDC, &client, marine);
    63.  
    64.     RECT rc3DFrame = client;
    65.     InflateRect (&rc3DFrame, -1, -1);
    66.  
    67.     RECT rcClientRaised = interior;
    68.     InflateRect (&rcClientRaised, 1, 1);
    69.  
    70.     RECT rcClientPushed = rcClientRaised;
    71.     InflateRect (&rcClientPushed, 1, 1);
    72.  
    73.     Draw3DRect (hDC, rc3DFrame, _3D_BORDER_RAISED);
    74.     Draw3DRect (hDC, rcClientRaised, _3D_BORDER_RAISED);
    75.     Draw3DRect (hDC, rcClientPushed, _3D_BORDER_PUSHED);
    76.  
    77.     RECT rcCaption = interior;
    78.     HBRUSH dark_blue = CreateSolidBrush (RGB (16, 74, 139));
    79.  
    80.     rcCaption.bottom = rcCaption.top + CAPTION_HEIGHT;
    81.     InflateRect (&rcCaption, -1, -1);
    82.     FillRect (hDC, &rcCaption, dark_blue);
    83.     DeleteObject (dark_blue);
    84.  
    85.     EndPaint (hWnd, &ps);
    86.  
    87.     DeleteObject (marine);
    88. }
    89.  
    90. // -------------------------------------------------------------------------
    91. LRESULT OnNcHitTest (HWND hWnd, LPARAM lp)
    92. {
    93.     RECT client;
    94.     RECT interior;
    95.  
    96.     GetClientRect (hWnd, &client);
    97.     interior = client;
    98.     InflateRect (&interior, -BORDER_WIDTH, -BORDER_WIDTH);
    99.  
    100.     POINT pt =
    101.     {
    102.         LOWORD (lp),
    103.         HIWORD (lp)
    104.     };
    105.  
    106.     ScreenToClient (hWnd, &pt);
    107.  
    108.     if (PtInRect (&interior, pt))
    109.     {
    110.         if (pt.y < (interior.top + CAPTION_HEIGHT))
    111.         {
    112.             if (pt.x > (interior.right - CAPTION_HEIGHT))
    113.             {
    114.                 return HTCLOSE;
    115.             }
    116.             return HTCAPTION;
    117.         }
    118.         return HTCLIENT;
    119.     }
    120.     else if (PtInRect (&client, pt))
    121.     {
    122.         if (pt.x < interior.left) return HTLEFT;
    123.         if (pt.x > interior.right) return HTRIGHT;
    124.  
    125.         if (pt.y < interior.top) return HTTOP;
    126.         if (pt.y > interior.bottom) return HTBOTTOM;
    127.     }
    128.     return HTNOWHERE;
    129. }
    130.  
    131. // -------------------------------------------------------------------------
    132. LRESULT CALLBACK callback_GenericWndProc (HWND hWnd, UINT uiMsg, WPARAM wp, LPARAM lp)
    133. {
    134.     switch (uiMsg)
    135.     {
    136.         case WM_NCLBUTTONDOWN:
    137.             if (wp == HTCLOSE)
    138.             {
    139.                 PostMessage (hWnd, WM_CLOSE, 0, 0);
    140.                 return 0;
    141.             }
    142.             return DefWindowProc (hWnd, uiMsg, wp, lp);
    143.  
    144.         case WM_NCHITTEST:
    145.             return OnNcHitTest (hWnd, lp);
    146.  
    147.         case WM_ERASEBKGND:
    148.             return 1;
    149.  
    150.         case WM_CLOSE:
    151.             PostQuitMessage (0);
    152.             break;
    153.  
    154.         case WM_PAINT:
    155.             OnPaint (hWnd);
    156.             break;
    157.  
    158.         default:
    159.             return DefWindowProc (hWnd, uiMsg, wp, lp);
    160.     }
    161.     return 0;
    162. }
    163.  
    164. // -------------------------------------------------------------------------
    165. int WINAPI WinMain (HINSTANCE hModule, HINSTANCE, LPSTR, int iCmdShow)
    166. {
    167.     WNDCLASS wc = {0};
    168.  
    169.     wc.style = CS_VREDRAW | CS_HREDRAW;
    170.     wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    171.     wc.hInstance = hModule;
    172.     wc.lpfnWndProc = callback_GenericWndProc;
    173.     wc.lpszClassName = L"NcHitTestSample";
    174.  
    175.     RegisterClass (&wc);
    176.  
    177.     HWND hMainWnd = CreateWindowEx
    178.         (
    179.             0,
    180.             wc.lpszClassName,
    181.             L"Win32 Wm_NcHitTest Sample",
    182.             WS_POPUP,
    183.             100, 60, 500, 480,
    184.             NULL, NULL, hModule, NULL
    185.         );
    186.  
    187.     ShowWindow (hMainWnd, iCmdShow);
    188.     UpdateWindow (hMainWnd);
    189.  
    190.     MSG message;
    191.  
    192.     while (GetMessage (&message, NULL, 0, 0))
    193.     {
    194.         TranslateMessage (&message);
    195.         DispatchMessage (&message);
    196.     }
    197.     return 0;
    198. }
     
  4. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Да принцип-то ясен, см. пост #15 :)

    Дело в другом: еще пост #12 выводит на ситуации, когда одного WM_NCHITTEST для ресайза (или драгдропа) - мало.
    Тогда как WM_SETCURSOR хватит и одного (да с бонусом: WM_NCHITTEST резервируется для решения иных задач).
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Ну, и в дополнение к примерам - тулза HTSpy (HitTester).