Все доброго времени суток! Меня интересует такой вопрос, возможно ли компонентам создаваемым с помощью winapi придавать современный вид, а то как-то топорно всё выглядит ? Нашел статью про это в msdn сдела так как там описано, у меня после этого стал VC вылелать... боюсь даже пытаться такое на асме делать как бы комп не стал вылетать... Посдкажите кто знает ? Может есть литература современная по look and feel с точки зрения низкоуровневого программирования ? Заранее спасибо!
Ну дак, штоб контролы красивые делать, нужно обладать еще и художественным вкусом Иначе по-любому будет топорно выглядеть.
windwail стиль +ownerdraw + рисование по месаге паренту. Форму любую - через регион на хвнд, а вообще я не знаю что вам современно. Цыганкам - одно, генералам - другое.
+1 Взять файл-манифест, запихать его в ресурсы: manifest.xml Код (Text): <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <description>Program Description</description> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Program Name" type="win32" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly> manifest.rc Код (Text): 1 24 DISCARDABLE "manifest.xml" далее откомпилировать ресурс: Код (Text): rc.exe manifest.rc откомпилировать программу: Код (Text): ml.exe /c /coff prog.asm слинковать c ресурсом: Код (Text): link.exe /SUBSYSTEM:WINDOWS prog.obj manifest.res
Перечитал внимательно msdn, вчера видимо башка не варила, аккуратно проделал то, что там написано. Заработало. Аказыца контролы выглядят постаринному квадратно когда отображаются в клиентской области, вне ее они выглядят как надо. Чтобы это дело заработало на C++ в VC, сделал следующее: 1. Добавил в настройки линкера ComCtl32.lib (Configuration Properties -> Linker -> Input) 2. Добавил в проекте в корень Source Files файл манифеста YourAppName.exe.manifest (У меня там получилось два файла Scrollbar.cpp и Scrollbar.exe.manifest) Собственно всё Заработало, даже не ожидал. до: после: Вот простенькая программка чтобы это дело проверить: Код (Text): #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; HINSTANCE hInst; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { hInst = hInstance; static TCHAR szAppName[] = TEXT ("Template") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("Color Scroll"), WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int cxClient = 0; static int cyClient = 0; static HWND scrollbar ; static HWND hwndEdit ; switch (message) { case WM_CREATE : scrollbar = CreateWindowEx(NULL, L"scrollbar", NULL, WS_VISIBLE | WS_CHILD | SBS_HORZ, 10,10,300,30, hwnd, (HMENU) 1, hInst, NULL); return 0; case WM_SIZE : cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
Все-таки это лишне Код (Text): wndclass.style = CS_HREDRAW | CS_VREDRAW ; не понимаю вообще смысл этих стилей. Убрал их, без них все работает, WM_PAINT нормально прорисовывает мои каракули, и контролы тоже не затираются. А с ними, все мелькать начинает...
windwail, попробуй сделать по аналогии с моим примером: добавь в скрипт ресурсов текст манифеста и навсегда отпадет необходимость таскать файл-манифест вместе с .exe Иначе тебе всегда надо будет класть .exe.manifest рядом с .exe
манифест - не всегда есть хорошо, например - попробуйте вставить в окно едит со свойством транспарент - и ему кирдык, у меня так...не знаю почему..
а я заметил, что маленькие программки с манифестом начинают заметно дольше грузится. видимо библиотека немаленькая. и еще не поддерживается стиль кнопок, если на кнопку будет добавлено изображение