Witam
Jestem w trakcie pisanie programu okienkowego w C++, z wykorzystaniem WinAPI. Oto mój kod:
#include<iostream>
#include<cmath>
#include<windows.h>
const double x0=1.2*M_PI;
const double x1=1.5*M_PI;
const double x2=1.8*M_PI;
double y_0=sin(x0);
double y_1=sin(x1);
double y_2=sin(x2);
LPSTR nazwaklasy="klasa_okna";
MSG komunikat;
HINSTANCE g_hInstance;
HWND okno1, button1, button2, okno_lagrange, okno_newtona, button_lagrange;
int g_nCmdShow;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void ilagrange();
void inewtona();
double lagrange(double 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;
//
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==button2) inewtona();
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);
double i=M_PI;
while(i<2*M_PI)
{
SetPixel(hdcOkno, int(100*i)+10, int(100*(lagrange(i)))+200, 0x000000FF);
i=i+0.0001;
}
UpdateWindow(okno_lagrange);
HWND hText=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,500, 500, 150, 20, okno_lagrange, NULL, g_hInstance, NULL);
UpdateWindow(okno_lagrange);
/*DWORD dlugosc = GetWindowTextLength( hText );
LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
GetWindowText( hText, Bufor, dlugosc + 1 );*/
ReleaseDC(okno_lagrange, hdcOkno);
}
void inewtona()
{
}
double lagrange(double 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))));
}
Program działa następująco: w oknie głównym programu znajdują się dwa przyciski. Po wybraniu przycisku wywoływana jest odpowiednia unkcja (na razi zrobiłem obsługę tylko funkcji interpolacja Lagrange'a). W funkcji tworzone jest nowe okienko, w którym rysowany jest wykres funkcji oraz pojawia się TextBox.
Mam następujące problemy:
- Chciałbym, aby tylko zamknięcie głównego okna programu powodowało zakończenie programu, a nie tak jak teraz, że zamknięcie dowolnego okna powoduje zakończenie programu.
- Nie wiem jaki sposób odczytać liczbę wpisaną do TextBoxa i wyświetlić ją np. jako MessageBox (dokładnie ma wyśweitlać wartość funkcji w podanym punkcie, ale jak będę wiedział jak wyświewtlić tekst wpisany do TextBoxa to będę potrafił wyświetlić też wartość funkcji.
- Jako, że jest to mój pierwszy program okienkowy, to prosiłbym o sprawdzenie ogólnej poprawności kodu :)
Będę wdzięczny za wszelkie sugestie i rady.
Pozdrawiam