Okienko w funkcji

0

Witam

Piszę program okienkowy, korzystając z WinAPI. W głównym konie programu są dwa przyciski. Naciśnięcie przycisku powoduje wywołanie odpowiedniej funkcji. W funkcji tej tworzone i wyświetlane jest nowe okno. Chciałbym, aby w tym oknie był przycisk, po którego naciśnięciu następuje akcja w tym oknie (konkretnie chodzi mi o narysowanie funkcji). Czy żeby to zrobić muszę tworzyć nową klasę dla okna w funkcji oraz pętlę komunikatów funkcji. Czy wystarczy przekazać z funkcji przez zmienną globalną uchwyt do tego okna i w pętli komunikatów "wyłapać" wciśnięcie tego przycisku i narysować wykres w tym oknie w funkcji WinMain?

Pozdrawiam

0

pokaż może trochę kodu...
i nie, na pewno w WinMain nic nie rysujesz.

0

To mój kod:

 #include<iostream>
#include<cmath>
#include<windows.h>

/*const float x0=M_PI+M_PI/5;
const float x1=1.2*M_PI;
const float x2=1.7*M_PI;*/
const float x0=1.2*M_PI;
const float x1=1.5*M_PI;
const float x2=1.8*M_PI;
float y_0=sin(x0);
float y_1=sin(x1);
float y_2=sin(x2);
LPSTR nazwaklasy="klasa_okna";
MSG komunikat;
HINSTANCE g_hInstance;
HWND okno1, button1, button2, okno_lagrange, button_lagrange;
int g_nCmdShow;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void ilagrange();
void rysuj_sinus(HWND okno);
double lagrange(float x);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = nazwaklasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    RegisterClassEx(&wc);
    g_hInstance=hInstance;
    g_nCmdShow=nCmdShow;

    // okno glowne
    okno1=CreateWindowEx(WS_EX_CLIENTEDGE, nazwaklasy, "Interpolacja", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 200, NULL, NULL, hInstance, NULL);
    ShowWindow(okno1, nCmdShow);
    UpdateWindow(okno1);
    button1=CreateWindowEx(0, "BUTTON", "Metoda Lagrange'a", WS_CHILD | WS_VISIBLE, 45, 30, 150, 30, okno1, NULL, hInstance, NULL);
    button2=CreateWindowEx(0, "BUTTON", "Metoda Newtona", WS_CHILD | WS_VISIBLE, 45, 90, 150, 30, okno1, NULL, hInstance, NULL);
    //

    while(GetMessage(&komunikat, NULL, 0, 0))
    {
        TranslateMessage(&komunikat);
        DispatchMessage(&komunikat);
    }
    return komunikat.wParam;
    return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE: DestroyWindow(hwnd); break;
        case WM_DESTROY: PostQuitMessage(0); break;
        case WM_COMMAND:
            if((HWND)lParam==button1) ilagrange();
            if((HWND)lParam==button_lagrange) rysuj_sinus(okno_lagrange);
            break;
        default: return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
void ilagrange()
{
    HDC hdcOkno;
    okno_lagrange=CreateWindowEx(WS_EX_CLIENTEDGE, nazwaklasy, "Interpolacja Lagrange'a", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, g_hInstance, NULL);
    hdcOkno=GetDC(okno_lagrange);
    ShowWindow(okno_lagrange, g_nCmdShow);

    TextOut(hdcOkno, 100, 30, "Interpolacja metod¹ Lagrange'a", 30);
    float i=M_PI;
    while(i<2*M_PI)
    {
        //SetPixel(hdcOkno, int(100*i)+10, int(100*(sin(i)))+200, RGB(12,34,56));
        SetPixel(hdcOkno, int(100*i)+10, int(100*(lagrange(i)))+200, 0x000000FF);
        //SetPixel(hdcOkno, int(100*i)+10, int(100*(sin(i)-lagrange(i)))+200, RGB(12,34,56));
        i=i+0.0001;
    }
    UpdateWindow(okno_lagrange);
    button_lagrange=CreateWindowEx(0, "BUTTON", "Pokaz sinus(x)", WS_CHILD | WS_VISIBLE, 300, 300, 150, 30, okno_lagrange, NULL, g_hInstance, NULL);

    ReleaseDC(okno_lagrange, hdcOkno);
}
double lagrange(float x)
{
    return (y_0*(((x-x1)*(x-x2))/((x0-x1)*(x0-x2)))+y_1*(((x-x0)*(x-x2))/((x1-x0)*(x1-x2)))+y_2*(((x-x0)*(x-x1))/((x2-x0)*(x2-x1))));
}
void rysuj_sinus(HWND okno)
{
    HDC hdcOkno;
    GetDC(okno_lagrange);
    float i=M_PI;
    while(i<2*M_PI)
    {
        SetPixel(hdcOkno, int(100*i)+100, int(100*(sin(i)))+200, 0x000000FF);
        i=i+0.0001;
    }
    UpdateWindow(okno_lagrange);
}

Gdy w głównym oknie programu wcisnę przycisk "Interpolacja Lagrange'a" to otwiera się okno. Na tym oknie jest przycisk "Pokaz sinus(x)". Chciałbym, aby po jego naciśnięciu "rysował" się wykres funkcji sinus (wywołanie funkcji

void rysuj_sinus(HWND okno)
)

1 użytkowników online, w tym zalogowanych: 0, gości: 1