Форум: Форум C++Разное
Новые темы: 00
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как инициализировать графику в MFC-приложении на VC++ 2005?
 
 автор: alex19921992   (03.02.2007 в 18:30)   письмо автору
 
 

Пишу:

CClientDC dc (CcinDlg);   //  cin -  имя моего проекта
dc.SetPixel(10,10,RGB(100,100,100));  // эта строка не компилится, говорит что dc должен быть классом/структурой/юнионом/еще чем-то

Не компилится! В мздне так написано но мздн же полный ацтой!!!!

  Ответить  
 
 автор: cheops   (04.02.2007 в 12:33)   письмо автору
 
   для: alex19921992   (03.02.2007 в 18:30)
 

А где дело происходит в методе класса CcinDlg? Попробуйте вместо CcinDlg писать this.
CClientDC dc (this);
dc.SetPixel(10,10,RGB(100,100,100));

PS Как точно выглядит сообщение об ошибке?

  Ответить  
 
 автор: alex19921992   (05.02.2007 в 14:11)   письмо автору
 
   для: cheops   (04.02.2007 в 12:33)
 

О! Теперь работает! Но тут есть другой вопрос: Мне надо получать события от мыши и сделать симулятор покупки билетов в зал кинотеатра (в школе задали), так вот мне надо функциии :
- инициализации мыши
- включения мыши
- выключения мыши
- получение данных о координатах курсора и состоянии кнопок
буду очень благодарен, если скажете!

  Ответить  
 
 автор: cheops   (05.02.2007 в 14:32)   письмо автору
 
   для: alex19921992   (05.02.2007 в 14:11)
 

Хм... под включением и выключением мыши что имеется в виду?

  Ответить  
 
 автор: alex19921992   (05.02.2007 в 14:47)   письмо автору
 
   для: cheops   (05.02.2007 в 14:32)
 

Ну вот, я хочу что-нибудь нарисовать, если мышь на этом месте,то рисоваться будет на мыши и изображение испортится (так под досом было), поэтому надо вырубать курсор(чтобы он не показывался), рисовать, а потом опять врубать.

З.Ы. Почему в МФЦ-приложении рисуется как-то криво? Цвет заливки никак не выбирается, и много еще чего.

З.З.Ы. Мне говорили, надо писать на чистом АПИ, тока в интернете нигде не могу найти нормальной инструкции, может поможете?

  Ответить  
 
 автор: cheops   (05.02.2007 в 15:44)   письмо автору
 
   для: alex19921992   (05.02.2007 в 14:47)
 

Хм... нужно вероятно менять курсор, с указателя на крестик.

Изучение Windows API лучше начинать с книги http://www.softtime.ru/cpp_info/petzold.php. В книге, кстати, можно найти пример рисования кривой при помощи мыши.

  Ответить  
 
 автор: alex19921992   (05.02.2007 в 18:20)   письмо автору
 
   для: cheops   (05.02.2007 в 15:44)
 

Это ж книга для вин95. Там моя прога первая не работает, еще написано про МАК-файл, но в вижуал си 6.0 такого нет! Объясни, че делать с МАК-файлом!

  Ответить  
 
 автор: cheops   (05.02.2007 в 20:03)   письмо автору
 
   для: alex19921992   (05.02.2007 в 18:20)
 

Windows API не сильно изменился (расширился, но структура осталась та же) с Windows 95, поэтому его изучение смело можно начинать с этой книги. В VC++ имеется специальный проект Application - там и следует создавать Windows API - файл, makefile студия построит сама в своём формате - об этом можно не беспокоиться.

PS Конечно, эта книга только начало (но очень хорошее), затем следует ознакомиться с книгой "Windows для профессионалов" Дж.Рихтера, а также использовать недавно выпущенный справочник "Microsoft Windows API".

  Ответить  
 
 автор: alex19921992   (06.02.2007 в 12:07)   письмо автору
 
   для: cheops   (05.02.2007 в 20:03)
 

Я сделал так: создал Вин32 апликайшен, добавил один главный срр - файл, скопировал код, запустил, и.....

hellowin.obj : error LNK2001: unresolved external symbol __imp__PlaySoundA@12

как с этим бороться?

  Ответить  
 
 автор: cheops   (06.02.2007 в 12:40)   письмо автору
 
   для: alex19921992   (06.02.2007 в 12:07)
 

А что за код используется?

  Ответить  
 
 автор: alex19921992   (06.02.2007 в 14:42)   письмо автору
 
   для: cheops   (06.02.2007 в 12:40)
 

Вот теперь другая проблема:
Прога должна при нажатии клавиши менять цвет прямоугольника, но не меняет, почему?

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
bool mybool=true/* отвечает пременная за состояние прямоугольника зеленый/синий*/
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(iMsg)
{
case WM_CREATE:

return 0;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);

  int i,j;    /*рисуем прямоугольник в зависимости от состояния переменной*/
  if(mybool==true) {for(i=0;i<100;i++)for(j=0;j<100;j++)SetPixel(hdc,i,j,RGB(0,0,255));}
  if(mybool==false){for(i=0;i<100;i++)for(j=0;j<100;j++)SetPixel(hdc,i,j,RGB(0,200,0));}

  EndPaint(hwnd, &ps);
return 0;
//-------------------------
case WM_KEYDOWN:  /*в зависимости от переменной меняем состояние*/
if(mybool==false)mybool=true;
if(mybool==true)mybool=false;
return 0;
//-------------------------

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

  Ответить  
 
 автор: cheops   (06.02.2007 в 15:20)   письмо автору
 
   для: alex19921992   (06.02.2007 в 14:42)
 

А если изменить размер окна или закрыть его другим окном - меняется цвет?

  Ответить  
 
 автор: alex19921992   (06.02.2007 в 15:55)   письмо автору
 
   для: cheops   (06.02.2007 в 15:20)
 

Нет!

  Ответить  
 
 автор: alex19921992   (06.02.2007 в 15:56)   письмо автору
 
   для: cheops   (06.02.2007 в 15:20)
 

Попробуй скомпилить, тока это не весь код, вот полный:

#include <windows.h>
#include <string.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(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;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindow(
szAppName, // window class name
"The Hello Program"// window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL
); // creation parameters
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
bool mybool;
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(iMsg)
{
case WM_CREATE:
//PlaySound("hellowin.wav", NULL, SND_FILENAME | SND_ASYNC);
return 0;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, "Hello, Windows 95!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  char* s;s=new char[5];strcpy(s,"hello");TextOut(hdc,10,10,s,5);
  
  int i,j;
  if(mybool==true) {for(i=0;i<100;i++)for(j=0;j<100;j++)SetPixel(hdc,i,j,RGB(0,0,255));}
  if(mybool==false){for(i=0;i<100;i++)for(j=0;j<100;j++)SetPixel(hdc,i,j,RGB(0,200,0));}

  EndPaint(hwnd, &ps);
return 0;
//-------------------------
case WM_KEYDOWN:
switch(wParam)
{
case VK_HOME:
if(mybool==false)mybool=true;
if(mybool==true)mybool=false;
SendMessage(hwnd,WM_PAINT,0,0);
break;
}
return 0;
//-------------------------

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

  Ответить  
 
 автор: cheops   (07.02.2007 в 00:07)   письмо автору
 
   для: alex19921992   (06.02.2007 в 15:56)
 

Замените
switch(wParam)
{
case VK_HOME:
if(mybool==false)mybool=true;
if(mybool==true)mybool=false;
SendMessage(hwnd,WM_PAINT,0,0);
break;

на

if(mybool==true)mybool=false;
break;

  Ответить  
 
 автор: alex19921992   (07.02.2007 в 05:53)   письмо автору
 
   для: cheops   (07.02.2007 в 00:07)
 

Это работает, но только после того, как поменять размер окна:
Подскажите пожалуйста, как сделать так, чтоб он сразу цвет менял?

#include <windows.h>
#include <string.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(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;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindow(
szAppName, // window class name
"The Hello Program"// window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL
); // creation parameters
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
bool mybool;
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(iMsg)
{
case WM_CREATE:
//PlaySound("hellowin.wav", NULL, SND_FILENAME | SND_ASYNC);
return 0;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, "Hello, Windows 95!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  char* s;s=new char[5];strcpy(s,"hello");TextOut(hdc,10,10,s,5);
  
  int i,j;
  if(mybool==true) {for(i=0;i<100;i++)for(j=0;j<100;j++)SetPixel(hdc,i,j,RGB(0,0,255));}
  if(mybool==false){for(i=0;i<100;i++)for(j=0;j<100;j++)SetPixel(hdc,i,j,RGB(0,200,0));}

  EndPaint(hwnd, &ps);
return 0;
//-------------------------
case WM_KEYDOWN:
switch (wParam)
{

case VK_HOME:if(mybool==true)mybool=falseelse mybool=true;break;
}
return 0;
//-------------------------

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

  Ответить  
 
 автор: cheops   (07.02.2007 в 16:21)   письмо автору
 
   для: alex19921992   (07.02.2007 в 05:53)
 

Нужно объявить область окна не действительной при помощи функции InvalidateRect(), чтобы сгенерировалось событие WM_PAINT и окно было перерисовано, добавьте в обработчик VK_HOME вызов
case VK_HOME:
  if(mybool==true)mybool=false;
  else mybool=true;
  InvalidateRect(hwnd, NULL, TRUE);
  break;

PS Вы кстати, зря попиксельно выводите - лучше определить квадрат и залить его - быстрее получится.
PPS Большие листинги лучше прикреплять в виде файлов, иначе тема очень быстро разрастается.

  Ответить  
 
 автор: alex19921992   (07.02.2007 в 18:53)   письмо автору
 
   для: cheops   (07.02.2007 в 16:21)
 

Спасибо вам большое! Вы мне очень помогаете!
Только вот я не знаю, как мне квадрат залить, Вроде могу ректангл нарисовать, а залить не знаю как, не подскажете?

PS: Кстати, я нашел забавную вещь: MessageBeep(0); воспроизводит стандартный виндовс-звук ошибки, а как остальные воспроизводить?

  Ответить  
 
 автор: alex19921992   (07.02.2007 в 19:25)   письмо автору
 
   для: alex19921992   (06.02.2007 в 14:42)
 

Кстати я понял, почему))))
Код

//-------------------------
case WM_KEYDOWN:  /*в зависимости от переменной меняем состояние*/
if(mybool==false)mybool=true;
if(mybool==true)mybool=false;
return 0;
//-------------------------

при входном "фолс " выдаст все равно фолс))))) вот я олень!!!!

Но мне уже на это пофиг))))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования