Как нарисовать в окошке?
Matou Дата: Суббота, 12 Марта 2011, 16:23 | Сообщение # 1
Исходный коТ
Сейчас нет на сайте
Допустим у меня есть некое окошко напрограммированое при помощи WinAPI, код можете не читать, там ничего интересного нет, выложил его чтобы показать что я якобы знаю как окошко в WinAPI сделать:
Code
#include <windows.h> HWND MainWindowHandle = 0; bool InitWindowsApp(HINSTANCE instanceHandle, int show); int Run(); LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nShowCmd) { if(!InitWindowsApp(hInstance, nShowCmd)) { ::MessageBox(0, L"Init - Failed", L"Error", MB_OK); return 0; } return Run(); } bool InitWindowsApp(HINSTANCE instanceHandle, int show) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = instanceHandle; wc.hIcon = ::LoadIcon(0, IDI_APPLICATION); wc.hCursor = ::LoadCursor(0, IDC_ARROW); wc.hbrBackground = static_cast<HBRUSH>(::GetStockObject(WHITE_BRUSH)); wc.lpszMenuName = 0; wc.lpszClassName = L"Hello"; if(!::RegisterClass(&wc)) { ::MessageBox(0, L"RegisterClass - Failed", 0, 0); return false; } MainWindowHandle = ::CreateWindow( L"Hello", L"Hello", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, instanceHandle, 0); if(MainWindowHandle == 0) { ::MessageBox(0, L"CreateWindow - Failed", 0, 0); return false; } ::ShowWindow(MainWindowHandle, show); ::UpdateWindow(MainWindowHandle); return true; } int Run() { MSG msg; ::ZeroMemory(&msg, sizeof(MSG)); while(::GetMessage(&msg, 0, 0, 0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND windowHandle, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_LBUTTONDOWN: // можно тута че-нить для начала написать return 0; case WM_KEYDOWN: if( wParam == VK_ESCAPE ) ::DestroyWindow(MainWindowHandle); return 0; case WM_DESTROY: ::PostQuitMessage(0); return 0; } return ::DefWindowProc(windowHandle, msg, wParam, lParam); }
Суть такова, хочу в этом окошке без излишних библиотек (в особенности без ОпенГЛ и ДиректХ), с использованием одной только <windows.h> нарисовать точечку, кружочек и линию, желательно разноцветные. Вопрос - как быть? ЗЫ VS2008
LunarPixel Дата: Суббота, 12 Марта 2011, 16:54 | Сообщение # 2
старожил
Сейчас нет на сайте
Уххх... ну сейчас вспомню что да как.. на С давно не кодил. Создавай приложение для win32.
Заходим в фаил с расширением .cpp После всего кода который появится пиши:
void Paint(HWND hwnd) { SetPixel(hdc, 100, 100, RGB(100, 100, 100)); // рисует точку с координатами 100:100 и цветом RGB(100, 100, 100) Ellipse(hdc,20,30,40,60); //рисует эллипс вписанный в прямоугольник (цыфры - координаты верхнего левого и нижнего плавого угла прямоугольника) }
У тебя так же будет в проекте фаил с расширением .h В него надо дописать
void Paint(HWND hwnd);
Далее ещё в файле .cpp в функции WndProc допиши Paint(hWnd); при обработке сообщения MW_PAINT если не ошибаюсь.
Блин, вылетела из головы функция рисования линии Ну хоть то что написал попробуй сделать...
Kefir87 Дата: Суббота, 12 Марта 2011, 17:01 | Сообщение # 3
участник
Сейчас нет на сайте
Code
case WM_PAINT: hdc = BeginPaint(hwnd, &ps); // Рисуем эллипс. Ellipse(hdc, 5, 10, 30, 40); // Рисуем скругленный прямоугольник. RoundRect(hdc, 35, 10, 85, 60, 25, 15); // Рисуем 2 параллельные линии. MoveToEx(hdc, 10, 70, NULL); LineTo(hdc, 60, 70); MoveToEx(hdc, 10, 80, NULL); LineTo(hdc, 60, 80); // Выводим текст. TextOut( hdc, 10, 100, "Some text", 9); EndPaint(hwnd, &ps);
LunarPixel Дата: Суббота, 12 Марта 2011, 17:05 | Сообщение # 4
старожил
Сейчас нет на сайте
MoveToEx(hdc, 10, 70, NULL); LineTo(hdc, 60, 70); Kefir87 , Точно... вот так линию рисовать Но всё же лучше это не сразу в WM_PAINT сувать, а сначала в функцию.. А потом уже функцию в WM_PAINT.
Сообщение отредактировал LunarPixel - Суббота, 12 Марта 2011, 17:05
Matou Дата: Суббота, 12 Марта 2011, 17:06 | Сообщение # 5
Исходный коТ
Сейчас нет на сайте
А как мне hdc определить? А то компилятор рукается Code
error C2065: 'hdc' : undeclared identifier
LunarPixel Дата: Суббота, 12 Марта 2011, 17:07 | Сообщение # 6
старожил
Сейчас нет на сайте
void Paint(HWND hwnd) { HDC hdc; ........ }
Сообщение отредактировал LunarPixel - Суббота, 12 Марта 2011, 17:08
Kefir87 Дата: Суббота, 12 Марта 2011, 17:10 | Сообщение # 7
участник
Сейчас нет на сайте
Code
void Paint(HWND hwnd) { HDC hdc; ........ }
И структуру для рисования нужно объявить
Code
void Paint(HWND hwnd) { HDC hdc; PAINTSTRUCT ps; ........ }
Сообщение отредактировал Kefir87 - Суббота, 12 Марта 2011, 17:10
LunarPixel Дата: Суббота, 12 Марта 2011, 17:11 | Сообщение # 8
старожил
Сейчас нет на сайте
Так, объединил свое и Kefir87'a: void Paint(HWND hwnd) { HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hwnd, &ps);
SetPixel(hdc, 100, 100, RGB(100, 100, 100)); Ellipse(hdc,20,30,40,60);
EndPaint(hwnd, &ps); }
Добавлено (12.03.2011, 17:11) ---------------------------------------------Kefir87 , опередил
Matou Дата: Суббота, 12 Марта 2011, 17:14 | Сообщение # 9
Исходный коТ
Сейчас нет на сайте
LunarPixel , Kefir87 , Спасибо, остальное легко наэмэсдиэнить можно) Обоим поставить плюсы не получается, Кефиру только через 7 дней смогу.