Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [C++] Poczatki w WinApi i problem z sprintf
Forum PHP.pl > Inne > Hydepark
Watt
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ć?
l0ud
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ć 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ść.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.