![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 372 Pomógł: 1 Dołączył: 13.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Dziś zacząłem cos tam grzebać w WinApi, ściągnąłem przykładowy program, no i jak zwykle bywa z początkami program nie działa. Googluje już od godziny, nie mogąc znaleźć rozwiązania więc postanowiłem napisać tutaj. Kod #include <windows.h> #include <iostream> #include <cstdlib> //#include <stdlib.h> using namespace std; char temp[10]; int num = 3; LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX WndCls; static char szAppName[] = "ExoFont"; MSG Msg; WndCls.cbSize = sizeof(WndCls); WndCls.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; WndCls.lpfnWndProc = WindProcedure; WndCls.cbClsExtra = 0; WndCls.cbWndExtra = 0; WndCls.hInstance = hInstance; WndCls.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndCls.hCursor = LoadCursor(NULL, IDC_ARROW); WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); WndCls.lpszMenuName = NULL; WndCls.lpszClassName = szAppName; WndCls.hIconSm = LoadIcon(hInstance, IDI_APPLICATION); RegisterClassEx(&WndCls); CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szAppName, "Fonts Fundamentals", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 450, 500, NULL, NULL, hInstance, NULL); while( GetMessage(&Msg, NULL, 0, 0) ) { TranslateMessage(&Msg); DispatchMessage( &Msg); } return static_cast<int>(Msg.wParam); } LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { HDC hDC; PAINTSTRUCT Ps; HFONT font; switch(Msg) { case WM_PAINT: hDC = BeginPaint(hWnd, &Ps); font = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Arial"); SelectObject(hDC, font); for(int x = 0; x < 100; x++){ sprintf( temp, "String%d",x); TextOut(hDC, 10, 10, temp, 12); } EndPaint(hWnd, &Ps); break; case WM_DESTROY: PostQuitMessage(WM_QUIT); break; default: return DefWindowProc(hWnd, Msg, wParam, lParam); } } Dokładniej chodzi o linijki Kod for(int x = 0; x < 100; x++){ sprintf( temp, "String%d",x); TextOut(hDC, 10, 10, temp, 12); } Chciałem, żeby zmieniał wypisywane liczby, ale kompilator (dev c++) nie chce zmienić typu zmiennej. Wie ktoś może co powinienem zrobić? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 387 Pomógł: 273 Dołączył: 18.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Nie rozumiem co chcesz osiągnąć - program działa poprawnie. Procedura rysowania uruchamia się raz na jakiś czas (w razie potrzeby) no i efektem jest pojawienie się napisu String99 (bo wszystkie poprzednie stringi są momentalnie nadpisywane przez następny). Jeżeli chcesz zobaczyć coś w stylu animacji, najbardziej prymitywnym sposobem jest dodanie chociażby "Sleep(200);" przed TextOut, ale spowoduje to, że procedura rysowania będzie trwała nieprawidłowo długo (do powinno to trwać najlepiej ułamek sekundy) i okno na czas jej wykonywania przestanie odpowiadać (IMG:style_emoticons/default/tongue.gif) Poprawne zrobienie takiej animacji jest trochę bardziej skomplikowane.
A tak na przyszłość do aplikacji okienkowych polecam zainteresować się czymś pokroju wxWidgets - pisanie w czystym WinAPI to raczej męczarnia, a tak zyskujesz większą wygodę pisania i (jeżeli niczego nie spaprasz) wieloplatformowość. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.09.2025 - 06:57 |