|
|
|
| Пишу:
CClientDC dc (CcinDlg); // cin - имя моего проекта
dc.SetPixel(10,10,RGB(100,100,100)); // эта строка не компилится, говорит что dc должен быть классом/структурой/юнионом/еще чем-то
|
Не компилится! В мздне так написано но мздн же полный ацтой!!!! | |
|
|
|
|
|
|
|
для: alex19921992
(03.02.2007 в 18:30)
| | А где дело происходит в методе класса CcinDlg? Попробуйте вместо CcinDlg писать this.
CClientDC dc (this);
dc.SetPixel(10,10,RGB(100,100,100)); |
PS Как точно выглядит сообщение об ошибке? | |
|
|
|
|
|
|
|
для: cheops
(04.02.2007 в 12:33)
| | О! Теперь работает! Но тут есть другой вопрос: Мне надо получать события от мыши и сделать симулятор покупки билетов в зал кинотеатра (в школе задали), так вот мне надо функциии :
- инициализации мыши
- включения мыши
- выключения мыши
- получение данных о координатах курсора и состоянии кнопок
буду очень благодарен, если скажете! | |
|
|
|
|
|
|
|
для: alex19921992
(05.02.2007 в 14:11)
| | Хм... под включением и выключением мыши что имеется в виду? | |
|
|
|
|
|
|
|
для: cheops
(05.02.2007 в 14:32)
| | Ну вот, я хочу что-нибудь нарисовать, если мышь на этом месте,то рисоваться будет на мыши и изображение испортится (так под досом было), поэтому надо вырубать курсор(чтобы он не показывался), рисовать, а потом опять врубать.
З.Ы. Почему в МФЦ-приложении рисуется как-то криво? Цвет заливки никак не выбирается, и много еще чего.
З.З.Ы. Мне говорили, надо писать на чистом АПИ, тока в интернете нигде не могу найти нормальной инструкции, может поможете? | |
|
|
|
|
|
|
|
для: alex19921992
(05.02.2007 в 14:47)
| | Хм... нужно вероятно менять курсор, с указателя на крестик.
Изучение Windows API лучше начинать с книги http://www.softtime.ru/cpp_info/petzold.php. В книге, кстати, можно найти пример рисования кривой при помощи мыши. | |
|
|
|
|
|
|
|
для: cheops
(05.02.2007 в 15:44)
| | Это ж книга для вин95. Там моя прога первая не работает, еще написано про МАК-файл, но в вижуал си 6.0 такого нет! Объясни, че делать с МАК-файлом! | |
|
|
|
|
|
|
|
для: alex19921992
(05.02.2007 в 18:20)
| | Windows API не сильно изменился (расширился, но структура осталась та же) с Windows 95, поэтому его изучение смело можно начинать с этой книги. В VC++ имеется специальный проект Application - там и следует создавать Windows API - файл, makefile студия построит сама в своём формате - об этом можно не беспокоиться.
PS Конечно, эта книга только начало (но очень хорошее), затем следует ознакомиться с книгой "Windows для профессионалов" Дж.Рихтера, а также использовать недавно выпущенный справочник "Microsoft Windows API". | |
|
|
|
|
|
|
|
для: cheops
(05.02.2007 в 20:03)
| | Я сделал так: создал Вин32 апликайшен, добавил один главный срр - файл, скопировал код, запустил, и.....
hellowin.obj : error LNK2001: unresolved external symbol __imp__PlaySoundA@12
как с этим бороться? | |
|
|
|
|
|
|
|
для: alex19921992
(06.02.2007 в 12:07)
| | А что за код используется? | |
|
|
|
|
|
|
|
для: 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);
}
|
| |
|
|
|
|
|
|
|
для: alex19921992
(06.02.2007 в 14:42)
| | А если изменить размер окна или закрыть его другим окном - меняется цвет? | |
|
|
|
|
|
|
|
для: cheops
(06.02.2007 в 15:20)
| | Нет! | |
|
|
|
|
|
|
|
для: 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);
}
|
| |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: 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=false; else mybool=true;break;
}
return 0;
//-------------------------
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
|
| |
|
|
|
|
|
|
|
для: 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 Большие листинги лучше прикреплять в виде файлов, иначе тема очень быстро разрастается. | |
|
|
|
|
|
|
|
для: cheops
(07.02.2007 в 16:21)
| | Спасибо вам большое! Вы мне очень помогаете!
Только вот я не знаю, как мне квадрат залить, Вроде могу ректангл нарисовать, а залить не знаю как, не подскажете?
PS: Кстати, я нашел забавную вещь: MessageBeep(0); воспроизводит стандартный виндовс-звук ошибки, а как остальные воспроизводить? | |
|
|
|
|
|
|
|
для: alex19921992
(06.02.2007 в 14:42)
| | Кстати я понял, почему))))
Код
//-------------------------
case WM_KEYDOWN: /*в зависимости от переменной меняем состояние*/
if(mybool==false)mybool=true;
if(mybool==true)mybool=false;
return 0;
//-------------------------
|
при входном "фолс " выдаст все равно фолс))))) вот я олень!!!!
Но мне уже на это пофиг)))) | |
|
|
|
|