| 
| ars | 
| Отправлено: 31.08.2004, 03:52 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | У меня возникла проблема — не могу выстовить через API jpg файлы на рабочий чтол, а с bmp файлами работает. Использовал SystemParametersInfo. Может кто-нибудь знает решение этой делемы?
 
 Второе — создал окно, полностью на API, в центре окна нарисовал кружок. Свернешь, развернешь — кружок пропадает, прикроешь другим приложением — тоже пропадает. Вообщем, хочу сделать окно как в компоненте AvtoRadrew = true. Многие оконные стили, свойства перебрал, но ... .
 Кто-нибудь знает как это исправить?
 
 
 |  
|  |  
| Dima | 
| Отправлено: 31.08.2004, 05:40 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 61
 
 
 
  
 | попробуй почитать книги. Например Ч. Петзолд "Программирование для Windows 95" 
 |  
|  |  
| timson | 
| Отправлено: 31.08.2004, 07:48 |  |  
| 
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 82
 
 
 
  
 | | QUOTE |  | Свернешь, развернешь — кружок пропадает, прикроешь другим приложением — тоже пропадает. | 
 WM_PAINT смотри...
 |  
|  |  
| Konstantine | 
| Отправлено: 31.08.2004, 08:10 |  |  
| 
 Мастер участка
 
 Группа: Модератор
 Сообщений: 545
 
 
 
  
 | По событию OnPaint перерисовуй вручную |  
|  |  
| ars | 
| Отправлено: 31.08.2004, 13:36 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Я думаю, что по OnPaint бессмысленно. Тогда уж по OnCenge лучше. Не, — это не выход! Насколько я знаю, WM_PAINT наступает во время рисования. Какой смысл спрашивается? Думаю всетаки нужен какой то стиль WNDCLASSEX? Как например HREDRAW, VREDRAW.
 А насчет выстовления jpg файлов на рабочий стол, кто-нибудь знает? Я делал так:
 SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\pic.jpg",
 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
 Но ... не работает, даже не ругается. В чем дело не пойму?
 
 |  
|  |  
| joynter | 
| Отправлено: 31.08.2004, 15:55 |  |  
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 137
 
 
 
  
 | исходник бы посмотреть |  
|  |  
| ars | 
| Отправлено: 31.08.2004, 16:31 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Смротри. Исходник: #include
 LRESULT CALLBACK WndProc(HWND hwnd, UINT messg, WPARAM wParam,LPARAM lParam);
 char message[] = "This is my first API-windows programm!";
 
 WNDCLASSEX wc;
 HWND hwnd;
 
 WINAPI WinMain(HINSTANCE hInst,
 HINSTANCE hPreInst,
 LPSTR lpszcmdLine,
 int cmdShow){
 wc.cbSize = sizeof(WNDCLASSEX);
 wc.lpszClassName = "CLASS1";
 wc.hInstance = hInst;
 wc.lpfnWndProc = WndProc;
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
 wc.lpszMenuName = NULL;//ìåíþ
 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
 wc.style = S_HREDRAW|CS_VREDRAW|CS_SAVEBITS;//|CS_NOCLOSE;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 if(!RegisterClassEx(&wc)){
 return false;
 }
 hwnd = CreateWindowEx(
 WS_EX_APPWINDOW,
 "CLASS1",
 "Просто окно",
 WS_OVERLAPPEDWINDOW|WS_VISIBLE,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 CW_USEDEFAULT,
 (HWND) NULL,
 (HMENU)NULL,
 (HINSTANCE)hInst,
 (LPSTR)NULL
 );
 ShowWindow(hwnd, cmdShow);
 UpdateWindow(hwnd);
 MSG msg;
 while(GetMessage(&msg,NULL,0,0)){
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 return 0;
 }
 LRESULT CALLBACK WndProc(HWND hwnd, UINT messg, WPARAM wParam,LPARAM lParam){
 switch(messg){
 case WM_CREATE:
 HRGN hrgn;
 MessageBox(NULL,"Creating","WndProc",MB_OK);
 SetWindowRgn(hwnd,hrgn,NULL);
 break;
 case WM_DESTROY:
 PostQuitMessage(0);
 break;
 case WM_KEYDOWN:
 HDC hdc;
 hdc = GetDC(hwnd);
 Ellipse(hdc,50,50,200,200);
 ReleaseDC(hwnd,hdc);
 break;
 
 default:
 return(DefWindowProc(hwnd,messg,wParam,lParam));
 }
 }
 
 
 
 |  
|  |  
| joynter | 
| Отправлено: 01.09.2004, 09:33 |  |  
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 137
 
 
 
  
 | а если задействовать WM_ACTIVATE и WM_MOVE ? что-то типа:
 
 switch(messg)
 {
 case WM_CREATE:
 HRGN hrgn;
 MessageBox(NULL,"Creating","WndProc",MB_OK);
 SetWindowRgn(hwnd,hrgn,NULL);
 break;
 case WM_DESTROY:
 PostQuitMessage(0);
 break;
 case WM_KEYDOWN :
 anchor: HDC hdc;
 hdc = GetDC(hwnd);
 Ellipse(hdc,50,50,200,200);
 ReleaseDC(hwnd,hdc);
 break;
 
 case WM_ACTIVATE :
 goto anchor;
 case WM_MOVE :
 goto anchor;
 default:
 return(DefWindowProc(hwnd,messg,wParam,lParam));
 }
 
 а про рабочий стол можно исходник?
 
 Отредактировано joynter — 01/09/2004, 10:37
 |  
|  |  
| Shura | 
| Отправлено: 01.09.2004, 12:59 |  |  
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 45
 
 
 
  
 | насколько я помню, на рабочий стол нельзя положить jpg. При ручном выборе обоев, когда выбираешь jpg он предлагает ActiveDesktop включить. 
 Насчет перерисовки — обрабатывай сообщение WM_PAINT
 |  
|  |  
| ** avtoritet | 
| Отправлено: 01.09.2004, 14:49 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Мозга не еб... ! Шура прав на все 100%! Код рисования пиши в событии WM_PAINT. И хватит выдумывать с метками. |  
|  |  
| joynter | 
| Отправлено: 01.09.2004, 15:02 |  |  
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 137
 
 
 
  
 | | QUOTE (** avtoritet @ 01/09/2004, 15:51) |  | Мозга не еб... ! Шура прав на все 100%! Код рисования пиши в событии WM_PAINT. И хватит выдумывать с метками. | 
 событие WM_PAINT наступает перед прорисовкой — будем по кругу бегать?
 а метки — ет от лени — не нравятся — пиши функцию my_paint() и вставляй ее в те же WM_ACTIVATE WM_MOVE и тд
 
 
 Отредактировано joynter — 01/09/2004, 16:12
 |  
|  |  
| ** avtoritet | 
| Отправлено: 01.09.2004, 15:33 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Да вот ты не веришь! Попробуй все ништяк будет. Пойми, когда окно накрыто, а потом активно — оно прорисовывается. Просто ты пишешь лишний код, лишние такты компа. Есть специальное событие — и оно — WM_PAINT. Туда можно сказать входят и WM_MOVE, WM_ACTIVE. Во так:
 switch(messg){
 case WM_CREATE:
 HRGN hrgn;
 MessageBox(NULL,"Creating","WndProc",MB_OK);
 SetWindowRgn(hwnd,hrgn,NULL);
 
 break;
 case WM_DESTROY:
 PostQuitMessage(0);
 break;
 case WM_PAINT:
 HDC hdc;
 hdc = GetDC(hwnd);
 Ellipse(hdc,50,50,200,200);
 ReleaseDC(hwnd,hdc);
 default:
 return(DefWindowProc(hwnd,messg,wParam,lParam));
 }
 |  
|  |  
| joynter | 
| Отправлено: 01.09.2004, 16:10 |  |  
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 137
 
 
 
  
 | | QUOTE (** avtoritet @ 01/09/2004, 16:35) |  | Да вот ты не веришь! Попробуй все ништяк будет. | 
 это первое ,что я попробывал — происходит следующее:
 1.вызываем Ellipse(hdc,50,50,200,200);
 2.перед прорисовкой приходит сообщение WM_PAINT
 3.по этому сообщению снова вызываем Ellipse(hdc,50,50,200,200);
 и так до бесконечности.
 (ежели ты мне не веришь, то посмотри загрузку проца во время выполнения)
 
 
 
 |  
|  |  
| ** avtoritet | 
| Отправлено: 01.09.2004, 16:26 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | нЕ ПОНЯЛ ЧТО УТЕБЯ НЕ ТАК? У меня все отлично. У тебя что, не прорисовывается то что надо под WM_PAINT. |  
|  |  
| joynter | 
| Отправлено: 01.09.2004, 16:36 |  |  
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 137
 
 
 
  
 | прорисовывается!!! причем постоянно!!!
 НЕ ОСТАНАВЛИВАЯСЬ!!!
 а хотелось бы чтоб один раз прорисовалось и остановилось на этом
 |  
|  |  
| ** avtoritet | 
| Отправлено: 01.09.2004, 16:58 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Ладно хватит! У меня что так, что так — еффект один! Постоянно! Странно! У меня только при: 1) Перетаскивание
 2) Изменение размеров
 3) Смене позиции(развернуть, сернуть..)
 4) Фокусе
 Все!
 |  
|  |  
| timson | 
| Отправлено: 01.09.2004, 19:42 |  |  
| 
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 82
 
 
 
  
 | кароче, такая фигня в API, про зацикливание WM_PAINT, надо системе то сказать, что мы рисуем и нам не надо пока еще это сообщение присылать 
 
 | CODE |  | HDC BeginPaint( HWND hwnd,            // handle to window
 LPPAINTSTRUCT lpPaint // paint information
 );
 
 BOOL EndPaint(
 HWND hWnd,                  // handle to window
 CONST PAINTSTRUCT *lpPaint  // paint data
 );
 | 
 
 вот че получается (сокр.):
 
 | CODE |  | switch(msg) {
 ...
 case WM_PINT:
 {
 PAINTSTRUCT ps;
 HDC hDC = BeginPaint(hWnd, &ps);
 
 DrawObject(hDC);
 
 EndPaint(hWnd, &ps);
 
 break;
 }
 ...
 }
 
 | 
 
 вроде (не вдавался в тему) это надо, т.е. так надо рисовать правильно...
   |  
|  |  
| timson | 
| Отправлено: 01.09.2004, 19:43 |  |  
| 
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 82
 
 
 
  
 |  
 Отредактировано timson — 01/09/2004, 20:46
 |  
|  |  
| joynter | 
| Отправлено: 02.09.2004, 10:43 |  |  
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 137
 
 
 
  
 | 2timson: вопрос чайника: а что, укаждого event'a есть BeginEvent и EndEvent или их ограниченное количество?
 |  
|  |  
| timson | 
| Отправлено: 02.09.2004, 18:05 |  |  
| 
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 82
 
 
 
  
 | как заработало?? 
 
 | QUOTE |  | а что, укаждого event'a есть BeginEvent и EndEvent или их ограниченное количество? | 
 нет, зачем, например, на WM_MOUSEMOVE такое..
 насчет ограниченного количества — может быть, незнаю, нада смотреть.. но кажется что должны быть....
 
 скорее всего BeginPaint() — EndPaint() надо, когда рисование занимает много времени (массив данных большой, или, что не надо делать, расчеты есть) и окну посылаются повторные сообщения о перерисовки...
 
 а вообще, когда процесс/поток нагружен, то сообщения с клавы, мыши не принемаются. а непосредственно в функци идет анализ состояния клавы, мыши (обычно в графике).
 |  
|  |  |