Добавил:
sergun
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:I курс / Задача с радиусом окружности / Circles / Wincsrc
.c#include <windows.h>
#include <stdio.h>
#include "resource.h"
LRESULT CALLBACK WinFunc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK OwnFunc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hTI;
char szWinName[]="MainWin";
char szOwnName[]="OwnedWin";
HWND hwnd;
HWND hown;
HDC memdc;
HBRUSH gr_b;
HBRUSH tr_b;
BOOL flg=FALSE;
float rad=0;
int tmo=0;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
MSG msg;
WNDCLASS wcl,owned;
int wx,wy;
char st[60];
hTI=hThisInst;
wcl.hInstance=hThisInst;
wcl.lpszClassName=szWinName;
wcl.lpfnWndProc=WinFunc;
wcl.style=0;
wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
wcl.lpszMenuName=(LPSTR)MENU1;
wcl.cbClsExtra=0;
wcl.cbWndExtra=0;
wcl.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
owned.hInstance=hThisInst;
owned.lpszClassName=szOwnName;
owned.lpfnWndProc=OwnFunc;
owned.style=CS_NOCLOSE;
owned.hIcon=LoadIcon(NULL,IDI_APPLICATION);
owned.hCursor=LoadCursor(NULL,IDC_CROSS);
owned.lpszMenuName=NULL;
owned.cbClsExtra=0;
owned.cbWndExtra=0;
owned.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
if (!RegisterClass (&wcl)) return 0;
if (!RegisterClass (&owned)) return 0;
wx=GetSystemMetrics(SM_CXMAXIMIZED)-2*GetSystemMetrics(SM_CXFRAME);
wy=GetSystemMetrics(SM_CYMENU)+GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYFRAME);
hwnd=CreateWindow(szWinName,"Main Window", WS_OVERLAPPEDWINDOW
,0,0,wx,wy, HWND_DESKTOP,NULL,hThisInst,NULL);
GetPrivateProfileString("App1","Radius","0.5",st,20,"wc.ini");
rad=(float)atof(st);
if ((rad<0.2)||(rad>10)) DialogBox(hTI,MAKEINTRESOURCE(DIALOG1),hwnd,DlgProc);
tmo=GetPrivateProfileInt("App1","Timeout",5,"wc.ini");
if (tmo<=0) tmo=5;
sprintf(st,"Owned Window (Timeout=%d sec.)",tmo);
hown=CreateWindow(szOwnName,st,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
hwnd,NULL,hThisInst,NULL);
ShowWindow(hown,nWinMode);
UpdateWindow(hown);
ShowWindow(hwnd,nWinMode);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
sprintf(st,"%f",rad);
WritePrivateProfileString("App1","Radius",st,"wc.ini");
sprintf(st,"%d",tmo);
WritePrivateProfileString("App1","Timeout",st,"wc.ini");
return 1;
}
int maxX,maxY;
LRESULT CALLBACK OwnFunc(HWND hown, UINT message,WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
HBITMAP hbit;
int x1,y1,x2,y2;
switch (message)
{
case WM_CREATE:
maxX=GetSystemMetrics(SM_CXSCREEN);
maxY=GetSystemMetrics(SM_CYSCREEN);
hdc=GetDC(hown);
memdc=CreateCompatibleDC(hdc);
hbit=CreateCompatibleBitmap(hdc,maxX,maxY);
SelectObject(memdc,hbit);
gr_b=GetStockObject(LTGRAY_BRUSH);
tr_b=GetStockObject(NULL_BRUSH);
SelectObject(memdc,gr_b);
PatBlt(memdc,0,0,maxX,maxY,PATCOPY);
ReleaseDC(hown,hdc);
break;
case WM_PAINT:
hdc=BeginPaint(hown,&ps);
BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);
EndPaint(hown,&ps);
break;
case WM_LBUTTONDOWN:
KillTimer(hown,115);
hdc=GetDC(hwnd);
SelectObject(memdc,tr_b);
//SelectObject(memdc,GetStockObject(BLACK_PEN));
x1=LOWORD(lParam)-(int)(rad*100);
x2=LOWORD(lParam)+(int)(rad*100);
y1=HIWORD(lParam)-(int)(rad*100);
y2=HIWORD(lParam)+(int)(rad*100);
Ellipse(memdc,x1,y1,x2,y2);
RedrawWindow(hown,NULL,NULL,RDW_INVALIDATE);
//SetTimer(hown,115,1000*tmo,NULL);
//flg=FALSE;
break;
case WM_MENUCHAR:
SetFocus(hwnd);
PostMessage(hwnd,WM_SYSCHAR,wParam,1|(1L<<29));
break;
case WM_TIMER:
PostMessage(hwnd,WM_COMMAND,ID_CLEAR,0);
flg=TRUE;
break;
default:
return DefWindowProc(hown,message,wParam,lParam);
}
return 0;
}
LRESULT CALLBACK WinFunc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_EXIT:
PostMessage(hwnd,WM_CLOSE,0,0);
break;
case ID_CLEAR:
SelectObject(memdc,gr_b);
PatBlt(memdc,0,0,maxX,maxY,PATCOPY);
RedrawWindow(hown,NULL,NULL,RDW_INVALIDATE);
break;
case ID_DIALOG:
DialogBox(hTI,MAKEINTRESOURCE(DIALOG1),hwnd,DlgProc);
break;
}
break;
case WM_CLOSE:
if(MessageBox(hwnd,"Are you sure?","HangUp",MB_YESNO|MB_ICONQUESTION)==IDYES) DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
BOOL CALLBACK DlgProc(HWND hDlg,UINT uMsg,WPARAM wPar,LPARAM lPar)
{
char str[80];
switch(uMsg)
{
case WM_INITDIALOG:
sprintf(str,"%4.2f",rad);
SetDlgItemText(hDlg,ID_EDIT,str);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wPar))
{
case IDOK:
GetDlgItemText(hDlg,ID_EDIT,str,80);
if(((float)atof(str)<0.2)||((float)atof(str)>10)){MessageBox(hDlg,"Должно быть число от 0.2 до 10","Ошибка",MB_ICONEXCLAMATION|MB_OK);return FALSE;};
rad=(float)atof(str);
EndDialog(hDlg,TRUE);
return TRUE;
case IDCANCEL:
EndDialog(hDlg,TRUE);
return TRUE;
}
}
return FALSE;
}