Современный вид компонентов на Win32 api

Тема в разделе "WASM.WIN32", создана пользователем windwail, 25 ноя 2008.

  1. windwail

    windwail New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    8
    Все доброго времени суток!
    Меня интересует такой вопрос, возможно ли компонентам создаваемым с помощью winapi придавать современный вид, а то как-то топорно всё выглядит ?
    Нашел статью про это в msdn :) сдела так как там описано, у меня после этого стал VC вылелать... боюсь даже пытаться такое на асме делать :) как бы комп не стал вылетать...
    Посдкажите кто знает ? Может есть литература современная по look and feel с точки зрения низкоуровневого программирования ?
    Заранее спасибо!
     
  2. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Ну дак, штоб контролы красивые делать, нужно обладать еще и художественным вкусом :)
    Иначе по-любому будет топорно выглядеть.
     
  3. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    windwail
    стиль +ownerdraw + рисование по месаге паренту. Форму любую - через регион на хвнд, а вообще я не знаю что вам современно. Цыганкам - одно, генералам - другое.
     
  4. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    manifest?
     
  5. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    ))

    Лучше уж с WASMa Xxcontrols скачать и не мучиться...
     
  6. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    +1
    Взять файл-манифест, запихать его в ресурсы:
    manifest.xml
    Код (Text):
    1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    2. <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    3. <description>Program Description</description>
    4. <assemblyIdentity
    5.     version="1.0.0.0"
    6.     processorArchitecture="X86"
    7.     name="Program Name"
    8.     type="win32"
    9. />
    10. <dependency>
    11.     <dependentAssembly>
    12.         <assemblyIdentity
    13.             type="win32"
    14.             name="Microsoft.Windows.Common-Controls"
    15.             version="6.0.0.0"
    16.             processorArchitecture="X86"
    17.             publicKeyToken="6595b64144ccf1df"
    18.             language="*"
    19.         />
    20.     </dependentAssembly>
    21. </dependency>
    22. </assembly>
    manifest.rc
    Код (Text):
    1. 1   24  DISCARDABLE "manifest.xml"
    далее откомпилировать ресурс:
    Код (Text):
    1. rc.exe manifest.rc
    откомпилировать программу:
    Код (Text):
    1. ml.exe /c /coff prog.asm
    слинковать c ресурсом:
    Код (Text):
    1. link.exe /SUBSYSTEM:WINDOWS prog.obj manifest.res
     
  7. windwail

    windwail New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    8
    mc black
    Спасибо большое за развернутую инструкцию! :)
    То что нада.
     
  8. windwail

    windwail New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    8
    Перечитал внимательно msdn, вчера видимо башка не варила, аккуратно проделал то, что там написано. Заработало. Аказыца контролы выглядят постаринному квадратно когда отображаются в клиентской области, вне ее они выглядят как надо.
    Чтобы это дело заработало на C++ в VC, сделал следующее:
    1. Добавил в настройки линкера ComCtl32.lib (Configuration Properties -> Linker -> Input)
    2. Добавил в проекте в корень Source Files файл манифеста YourAppName.exe.manifest (У меня там получилось два файла Scrollbar.cpp и Scrollbar.exe.manifest)

    Собственно всё :) Заработало, даже не ожидал.
    до:
    [​IMG]
    после:
    [​IMG]


    Вот простенькая программка чтобы это дело проверить:

    Код (Text):
    1. #include <windows.h>
    2.  
    3. LRESULT CALLBACK WndProc    (HWND, UINT, WPARAM, LPARAM) ;
    4.  
    5. HINSTANCE hInst;
    6.  
    7. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    8.                     PSTR szCmdLine, int iCmdShow)
    9. {
    10.  
    11.     hInst = hInstance;
    12.     static TCHAR szAppName[] = TEXT ("Template") ;
    13.     HWND         hwnd ;
    14.     MSG          msg ;
    15.     WNDCLASS     wndclass ;
    16.  
    17.     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
    18.     wndclass.lpfnWndProc   = WndProc ;
    19.     wndclass.cbClsExtra    = 0 ;
    20.     wndclass.cbWndExtra    = 0 ;
    21.     wndclass.hInstance     = hInstance ;
    22.     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
    23.     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    24.     wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    25.     wndclass.lpszMenuName  = NULL ;
    26.     wndclass.lpszClassName = szAppName ;
    27.  
    28.     if (!RegisterClass (&wndclass))
    29.     {
    30.         MessageBox (NULL, TEXT ("This program requires Windows NT!"),
    31.             szAppName, MB_ICONERROR) ;
    32.         return 0 ;
    33.     }
    34.  
    35.     hwnd = CreateWindow (szAppName, TEXT ("Color Scroll"),
    36.                                     WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,
    37.                                     CW_USEDEFAULT, CW_USEDEFAULT,
    38.                                     CW_USEDEFAULT, CW_USEDEFAULT,
    39.                                     NULL, NULL, hInstance, NULL) ;
    40.  
    41.     ShowWindow (hwnd, iCmdShow) ;
    42.     UpdateWindow (hwnd) ;
    43.  
    44.     while (GetMessage (&msg, NULL, 0, 0))
    45.     {
    46.         TranslateMessage (&msg) ;
    47.         DispatchMessage  (&msg) ;
    48.     }
    49.     return msg.wParam ;
    50. }
    51.  
    52. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    53. {
    54.     static int cxClient = 0;
    55.     static int cyClient = 0;
    56.     static HWND scrollbar ;
    57.     static HWND hwndEdit ;
    58.    
    59.     switch (message)
    60.     {
    61.         case WM_CREATE :
    62.             scrollbar = CreateWindowEx(NULL, L"scrollbar", NULL, WS_VISIBLE | WS_CHILD | SBS_HORZ, 10,10,300,30, hwnd, (HMENU) 1, hInst, NULL);
    63.             return 0;
    64.         case WM_SIZE :
    65.             cxClient = LOWORD (lParam) ;
    66.             cyClient = HIWORD (lParam) ;
    67.             return 0 ;
    68.         case WM_DESTROY :
    69.             PostQuitMessage (0) ;
    70.             return 0 ;
    71.     }
    72.     return DefWindowProc (hwnd, message, wParam, lParam) ;
    73. }
     
  9. windwail

    windwail New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    8
    Все-таки это лишне
    Код (Text):
    1. wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
    не понимаю вообще смысл этих стилей. Убрал их, без них все работает, WM_PAINT нормально прорисовывает мои каракули, и контролы тоже не затираются. А с ними, все мелькать начинает...
     
  10. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Это совершенно разные контролы.
     
  11. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    windwail, попробуй сделать по аналогии с моим примером: добавь в скрипт ресурсов текст манифеста и навсегда отпадет необходимость таскать файл-манифест вместе с .exe Иначе тебе всегда надо будет класть .exe.manifest рядом с .exe
     
  12. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    манифест - не всегда есть хорошо, например - попробуйте вставить в окно едит со свойством транспарент - и ему кирдык, у меня так...не знаю почему..
     
  13. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    а я заметил, что маленькие программки с манифестом начинают заметно дольше грузится. видимо библиотека немаленькая.
    и еще не поддерживается стиль кнопок, если на кнопку будет добавлено изображение