ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

C++ граф. задача нужна помощь
  #1  
Старый 21.05.2007, 00:37
Аватар для Visor
Visor
Новичок
Регистрация: 04.06.2006
Сообщений: 29
Провел на форуме:
133649

Репутация: 6
Unhappy C++ граф. задача нужна помощь

Здравствуйте, уважаемые участники форума. Получил вот такое задание, но возникли проблемы...
Программа Win32 для рисования на экране прямых линий. Начало и конец линии задаются двумя последовательными нажатиями на левую кнопку мыши в основном окне программы. Нажатие на правую очищает экран. Также должен автоматически очищаться через время t после рисования последней линии. Добиться сохранения рисунка при помощи memory bitmaps после перекрытия окна лругими окнами.
При выборе свойства линии, программа должна вывести диал. окно. в checkbox выбираем тип (штриховая или сплошная). А radio buttons для цветов.
Таймаут - тут задается t.
Выход - запрашивает о выходе, и при утвердительном ответе обновить в ini-файле все параметры (тип линии, время таймаута), после этого завершить работу. При повторном запуске, программа загрузит сохраненные параметры из ini-файла.
Проблема в том, что программа виснет при выборе дочернего элемента в гл. меню. Кроме того она не рисует штриховые линии . Я пробовал менят время задержки, последовательно комментировать те или иные функции и пр., с отладчиком. Ничего. Мне кажется, что дело в WM_PAINT. Иногда получалось по-отдельности включать нужные функции, но все вместе - никогда не работало. Сам над этим уже два месяца голову ломаю, ничего не могу сделать.
Если совсем никак, то можете удалить пост или не смотреть вообще.
С меня много плюсиков, если получится!
Проект (включая resource.h и пр.) для MSVS 2005 выложил тут в *.rar
А вот то нечто, что мне удалось написать:
Код:
#include <windows.h>
#include <stdio.h>
#include "resource.h"
#define  TIMER_ID 1
  
HINSTANCE hhh;

int dedit=5;
int colornumber=1;
bool linestyle=false;
bool startline=true;
bool t=false;
int x,y,x0,y0;

HPEN pen;

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);

//-------------------------------------------------------------------
// WinMain
//-------------------------------------------------------------------
int WINAPI WinMain (HINSTANCE hThisInst, 
  					  HINSTANCE hPrevInst,
  					  LPSTR lpszArgs,
  					  int nWinMode)
{
  char szWinName[] = "класс окна";
  MSG msg;
  HWND hwnd;
  WNDCLASS wcl;
  
  hhh=hThisInst;

  // класс окна 
  wcl.hInstance = hThisInst;     //идентификатор приложения
  wcl.lpszClassName = szWinName; //имя класса окна
  wcl.lpfnWndProc = WindowFunc;  //функция окна
  wcl.style = 0;                 // стиль по умолчанию
  wcl.hIcon = LoadIcon(NULL,IDI_APPLICATION); //стандартная иконка
  wcl.hCursor = LoadCursor(NULL,IDC_ARROW);   //стандартный курсор мыши
  wcl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);       //без меню  
  wcl.cbClsExtra = 0;
  wcl.cbWndExtra = 0;
  wcl.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // Цвет фона окна
  
  if (!RegisterClass (&wcl)) return 0;
  
  // CreateWindow
  hwnd = CreateWindow(szWinName,"Мое первое оконо",
    	 WS_OVERLAPPEDWINDOW,
	  	 CW_USEDEFAULT, // горизонтальное положение окна
	  	 CW_USEDEFAULT, // вертикальное положение окна	
	  	 CW_USEDEFAULT, // ширина окна	
	  	 CW_USEDEFAULT, // высота окна	 
	  	 HWND_DESKTOP,
	  	 NULL,
	  	 hThisInst,
	  	 NULL);

  // Показать окно и нарисовать содержимое
  ShowWindow(hwnd,nWinMode);
 
  // Цикл обработки сообщений
  while (GetMessage (&msg, NULL, 0, 0))
  {
	  TranslateMessage (&msg);
	  DispatchMessage (&msg);
  }

  return msg.wParam;
}	                  
  
//-------------------------------------------------------------------

//диалоговое окно

BOOL CALLBACK DialogProcTime(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{   char str[10];
	switch (uMsg)
	{
	case WM_INITDIALOG:
		sprintf(str,"%d",dedit);
		SetDlgItemText(hDlg,IDC_EDIT1,str);
		return TRUE;
		break;
    case WM_COMMAND:
		switch(LOWORD(wParam))
		 {
		 case IDOK:
            GetDlgItemText(hDlg,IDC_EDIT1,str,10);
			dedit = atoi(str);
          	EndDialog(hDlg,TRUE); 
			return TRUE;
			break;
		 case IDCANCEL:
			EndDialog(hDlg,TRUE); 
			return TRUE;
			break;
		 }
		break;
	}
	return FALSE;
}



//диалоговое окно

BOOL CALLBACK DialogProcSvoistva(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{   
	/*
	switch (uMsg)
	{
	case (WM_INITDIALOG):
		CheckRadioButton(hDlg, IDC_RADIO1, IDC_RADIO5, IDC_RADIO1+colornumber-1);
		if (linestyle)
		   CheckDlgButton(hDlg, IDC_CHECK1, BST_CHECKED);
		else
           CheckDlgButton(hDlg, IDC_CHECK1, BST_UNCHECKED);
		return TRUE;
		break;
    case WM_COMMAND:
		switch(LOWORD(wParam))
		 {
		 case IDOK:
            if (IsDlgButtonChecked(hDlg, IDC_RADIO1))
               colornumber=1;
			if (IsDlgButtonChecked(hDlg, IDC_RADIO2))
               colornumber=2;
			if (IsDlgButtonChecked(hDlg, IDC_RADIO3))
               colornumber=3;
			if (IsDlgButtonChecked(hDlg, IDC_RADIO4))
               colornumber=4;
			if (IsDlgButtonChecked(hDlg, IDC_RADIO5))
               colornumber=5;
			if (IsDlgButtonChecked(hDlg, IDC_CHECK1))
               linestyle=true;
			else
               linestyle=false;
          	EndDialog(hDlg,TRUE); 
			return TRUE;
			break;
		 case IDCANCEL:
			EndDialog(hDlg,TRUE); 
			return TRUE;
			break;
		 }
		break;
 }
*/
	return FALSE;
}



// Функция - обработчик сообщений окна
//-------------------------------------------------------------------
LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,
  						WPARAM wParam,LPARAM lParam)
{   
  PAINTSTRUCT ps;
  HDC dc;
  HPEN blackpen,whitepen,redpen,greenpen,bluepen;
 

 
  switch (message)
  {
     case WM_DESTROY:
  		  PostQuitMessage(0); 
  	   	 break; 

     case WM_COMMAND:
         switch(LOWORD(wParam))
		 {
		 case ID_EXIT:
            if (MessageBox(hwnd,"Действительно ли вы хотите выйти?","",MB_OKCANCEL)==IDOK)
			{
				PostQuitMessage(0);
			}
			break;
		 case ID_TIMEOUT:
			DialogBox(hhh,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,DialogProcTime);               	
			break;
		 case ID_SVOISTVA:			
			    DialogBox(hhh,MAKEINTRESOURCE(IDD_DIALOG2),hwnd,DialogProcSvoistva);				
			break;
		 }
		 break;
      case WM_PAINT:		  
		 if (t)
		 {
		      dc=BeginPaint(hwnd, &ps);
			  if (startline)
			  {
				  x0=x;
				  y0=y;
				  startline=false;
			  }
			  else
			  {

				  blackpen=CreatePen(PS_SOLID,2,RGB(0,0,0));
				  whitepen=CreatePen(PS_SOLID,2,RGB(255,255,255));
                  redpen=CreatePen(PS_SOLID,2,RGB(255,0,0));
                  greenpen=CreatePen(PS_SOLID,2,RGB(0,255,0));
                  bluepen=CreatePen(PS_SOLID,2,RGB(0,0,255));
				  if (colornumber==1) SelectObject(dc,blackpen);
				  if (colornumber==2) SelectObject(dc,whitepen);
				  if (colornumber==3) SelectObject(dc,redpen);
				  if (colornumber==4) SelectObject(dc,greenpen);
				  if (colornumber==5) SelectObject(dc,bluepen);
				  MoveToEx(dc, x0, y0, NULL);
				  LineTo(dc, x, y);
				  startline=true;
				  SetTimer(hwnd,TIMER_ID,1000*dedit,NULL);
			  }
			  EndPaint(hwnd, &ps);
		 }
			  break;
      case WM_LBUTTONDOWN : 		  
			  x=LOWORD(lParam);
			  y=HIWORD(lParam);
			  t=true;
			  InvalidateRect(hwnd,0,FALSE);
              UpdateWindow(hwnd);
			  break;
      case WM_RBUTTONDOWN :
              t=false;
		      InvalidateRect(hwnd,0,TRUE);
              UpdateWindow(hwnd);
			  startline=true;
			  break;
	  case WM_TIMER:
		      KillTimer(hwnd,TIMER_ID);
              t=false;
			  InvalidateRect(hwnd,0,TRUE);
              UpdateWindow(hwnd);
		      break;
		  
  	default:
  		return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}
Спасибо заранее, если посмотрите, так как в C++ я совсем чайник.

Последний раз редактировалось Visor; 22.05.2007 в 20:07..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь! Black_Death Болталка 7 11.12.2004 16:03
Нужна помощь... Чаты 2 24.02.2003 02:17
Нужна помощь Амир Чаты 0 04.09.2002 11:21



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ