Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарисовать эллипс в другом окне 
V
    Опции темы
Agentx86
Дата 21.4.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Надо написать два приложения. Первое рисует прямоугольник. А при запуске второго приложения оно должно вместо прямоугольника рисовать эллипс. При закрытии второго приложения опять должно рисовать прямоугольник. Главное правило чтоб в первом приложении нигде не было вызова функции рисования эллипса.
Я  во второй программе вызвал FindWindow узнал хендл первого приложения и при помощи Getdc ReleaseDC попытался нарисовать эллипс в хендле который вернула функция FinWindow. У меня ничего не получилось. 
Подскажите пожалуйста как можно решить эту задачу.
PM MAIL   Вверх
-Kp0T-
Дата 22.4.2007, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 23.2.2007

Репутация: 2
Всего: 2



 Млин, не спиться...:(
Решить эту задачу можно по-всякому.
Предложенный мною вариант на скорую руку:
Код

/*Фрагменты кода shape1.cpp
 *Созданное окно будет иметь заголовок "shape1"
 */

...
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 ...
    case WM_CREATE:
        GetWindowRect(hWnd,&rc); //получим координаты окна
        SetWindowPos(hWnd,HWND_TOPMOST,rc.left,rc.bottom, 110,110 ,SWP_SHOWWINDOW); //"shape1" будет поверх всех окон
 ...
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps); 

        if(FindWindow("shape2",NULL)==NULL) //ищем окно 2-й проги:
        { //если не находим её 
            HPEN hp;
            HBRUSH hb;
            SelectObject(hdc,hp=CreatePen(PS_SOLID,5,RGB(0,100,0)));
            SelectObject(hdc,hb=CreateSolidBrush(RGB(99,255,99)));
            Rectangle(hdc,10,10,105,50); //  рисуем приямоугольник
            DeleteObject(hp);
            DeleteObject(hb);
        }
        else //Если находим, то
        {
            HWND hwShape2=FindWindow("shape2",NULL);
            if(hwShape2!=NULL)SendMessage(hwShape2,WM_USER+132,0,0); // посылаем сообщение второму окну USER+132 (оно будет означать что надо бы мне ("shape1") перерисоваться ...)
        }
        EndPaint(hWnd, &ps);
        break;
 ...
}
...



/*Фрагменты кода shape2.cpp
 *Созданное окно будет иметь заголовок "shape2"
 */

...
void DrawEllipse() //все просто, эта функция
{
  ...
    if(hwnd=FindWindow("shape1",NULL)==NULL)return; //ищет окно "shape1", если нет его просто выходит из фунции
    hwdc=GetDC(hwnd);//а если находит пытается получить описатель контекста устройства, после чего
    SelectObject(hwdc,hp=CreatePen(PS_SOLID,5,RGB(11,10,11)));
    SelectObject(hwdc,hb=CreateSolidBrush(RGB(155,0,155)));
    Ellipse(hwdc,10,20,105,50); //рисует эллипс
    ReleaseDC(hwnd,hwdc);
    InvalidateRgn(hwnd,NULL,TRUE);//фон окна очистим от старого прямоугольника
    UpdateWindow(hwnd); //обновим с эллипсом
    DeleteObject(hp);
    DeleteObject(hb);
}
...
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 ...
   switch (message) 
   {
   case WM_USER+132:
        hwnd=FindWindow("shape1",NULL);
        DrawEllipse();
        break;
 ...
   case WM_CREATE:
        DrawEllipse();
        break;
 ...
   case WM_DESTROY: /*Тут главное корректно выйти и обновить окно. Перед тем как вызвать InvalidateRng для "shape1" необходимо систему освободить от нашего окна "shape2". Иначе получим в shape1 белый фон*/
        hwnd=FindWindow("shape1",NULL); 
        DestroyWindow(hWnd);
        WaitForInputIdle((HANDLE)hShape1ProcID,INFINITE);
        InvalidateRgn(hwnd,NULL,TRUE);
        PostQuitMessage(0);
        break;
...


Вроде все. Сорцы прилагаются.
P.S. Тему закрывай. Решено.

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Shapes_by_Kp0T.7z 34,82 Kb
PM MAIL   Вверх
Agentx86
Дата 22.4.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Крот твое приложение у меня работает немного не корректно. Тему закрываю. Вообще я решил эту задачу через 10 минут как создал тему. Подумал может ктото подскажет какой нибудь другой способ.
Твоя прога рисует эллипс, но сразу вызывается перерисовка у первого окна и окно становится пустым.
Как я решил эту задачу? Я второй прогой в контексте устройстава первого окна рисовал эллипс по таймеру. А при закрытии второго окна я просто вызываю перерисовку первого окна.
PM MAIL   Вверх
-Kp0T-
Дата 22.4.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 23.2.2007

Репутация: 2
Всего: 2



 Может чего то я недопонял. но у меня лично на shape1 всгегда есть рисунок. Либо прямоугольник либо эллипс, в зависимости от активности программы shape2. В окне shape2 вообще ничего не рисуется, не планировалось smile
PM MAIL   Вверх
Agentx86
Дата 23.4.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Во втором окне ничего и не рисуется. Просто при вызове второго приложения в первом рисуется эллипс и сразу же он пропадет. При закрытии второго приложения опять рисуется прямоугольник. Я понял что у тебя работает все нормально. Просто виндовс это такая ось, что от неё можно ждать все что угодно. Лана не будем замарачиваться и искать в чем прикол. Главное, что решили задачу, а это главное.
PM MAIL   Вверх
Earnest
Дата 23.4.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Agentx86 @  23.4.2007,  13:57 Найти цитируемый пост)
Просто виндовс это такая ось, что от неё можно ждать все что угодно.

Просто это такая ось, что нужно уметь ее готовить... Надо полагать, как с любой другой... smile 



--------------------
...
PM   Вверх
Ln78
Дата 24.4.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: нет
Всего: 15



Agentx86, здесь немного подкорректированный фрагмент кода -Kp0T-, с комментарием:
Код

  hwnd=FindWindow("shape1",NULL);
  if(hwnd==NULL)return;
  hwdc=GetDC(hwnd);
  RECT rect;
  GetClientRect(hwnd, &rect);
  SelectObject(hwdc, GetStockObject(WHITE_BRUSH) );
  Rectangle(hwdc, rect.left, rect.top, rect.right, rect.bottom );
  SelectObject(hwdc,hp=CreatePen(PS_SOLID,5,RGB(11,10,11)));
  SelectObject(hwdc,hb=CreateSolidBrush(RGB(155,0,155)));
  Ellipse(hwdc,10,20,105,50);
  ReleaseDC(hwnd,hwdc);
//   InvalidateRgn(hwnd,NULL,TRUE); // А удали-ка мне всё, что было раньше и то, что я нарисовал
//    UpdateWindow(hwnd); //Да поживее, а то мелькает
  DeleteObject(hp);
  DeleteObject(hb);


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.