api정복책이 안와서 주말에 바로 winapi에서 공부해서 짜봤는데
타이머에서 cnt 조건에 따라 WM_APINT로 센드 메시지 해주는 부분에서
뭔가 잘못된거같은데 잘안보이네요 ㅠㅠㅠ
평소에 눈팅만하다가 이렇게 소스관련질문 올려보니
얼굴이 화끈거리는군요 ㅠㅠ
#include <windows.h>
#include <time.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="화면보호기"; //윈도클래스 이름정의
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
/* 1.윈도우의 기반 클래스 \'WndClass\' 정의 */
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //배경색상 브러시 지정
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass; //윈도클래스 이름지정
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass); //윈도우 등록과정
/* 2.메모리상에 윈도우를 만듬 */
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW, //윈도우 생성 클래스네임, 윈도네임, 윈도형태 순
100,100,400,200, //x,y,nWidth,nHeight 순
NULL,(HMENU)NULL,hInstance,NULL); //부모윈도,메뉴핸들,프로그램핸들,CREATESTRUCT 번지 <-지금알건 아니다 버리자
/* 3.윈도우를 화면에 표시 */
ShowWindow(hWnd,nCmdShow);
/* 4.사용자 메시지 처리 */
while(GetMessage(&Message,0,0,0)) { //\'GetMessage\' : 읽은 메시지가 \'WM_QUIT\' 일경우 \'False\',아닐경우 \'True\' 리턴
TranslateMessage(&Message); //키보드 입력 메시지를 가공
DispatchMessage(&Message); //메시지를 \'WndProc\'(메시지처리함수)로 전달
}
return Message.wParam;
}
/* 윈도우 메시지가 발생할때 호출되어 처리하는 \'Call Back\'함수 \'WndProc\' */
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) //메시지를받을 윈도핸들,메시지 종류,메시지의 부가정인 정보*2
{
HDC hdc;
PAINTSTRUCT ps;
HPEN MyPen;
static int cnt =1;
static int n = rand()%90+10;
static int change = 400;
RECT rt={0,0,1000,400};
switch(iMessage){
case WM_CREATE:
SetTimer(hWnd,1,500,NULL);
AdjustWindowRect(&rt,WS_OVERLAPPEDWINDOW,FALSE);
MoveWindow(hWnd,100,100,rt.right-rt.left,rt.bottom-rt.top,FALSE);
return 0;
case WM_TIMER:
switch(wParam)
case 1:
{
if(cnt==0){
SendMessage(hWnd,WM_PAINT,4,0);
}
else if(cnt==1){
SendMessage(hWnd,WM_PAINT,3,0);
}
else
SendMessage(hWnd,WM_PAINT,2,0);
break;
}
return 0;
case WM_PAINT:
switch(wParam){
case 4:{ //cnt==0 :출력이 끝났을시
hdc=BeginPaint(hWnd, &ps);
MoveToEx(hdc,1000,0,NULL);
InvalidateRect(hWnd,&rt,TRUE);
srand((unsigned)time(NULL));
change = 400;
cnt = 1;
break;
}
case 3:{ //n==1 :처음출력시
srand((unsigned)time(NULL));
n = rand()%90+10;
hdc=BeginPaint(hWnd, &ps);
MyPen=CreatePen(PS_SOLID, 1, RGB(255,0,0));
SelectObject(hdc, MyPen);
MoveToEx(hdc,1000,00,NULL);
LineTo(hdc,1000-cnt*(1000/n),change);
EndPaint(hWnd, &ps);
DeleteObject(MyPen);
change = change^400;
cnt++;
break;
}
case 2:{ //else :일반출력도중
hdc=BeginPaint(hWnd, &ps);
MyPen=CreatePen(PS_SOLID, 1, RGB(255,0,0));
SelectObject(hdc, MyPen);
LineTo(hdc,1000-cnt*(1000/n),change);
EndPaint(hWnd, &ps);
DeleteObject(MyPen);
change = change^400;
cnt++;
if(cnt==n){ //cnt=0 은 출력끝의 신호이다
cnt=0;
}
break;
}
}
return 0;
case WM_CHAR: //키입력시 끝
KillTimer(hWnd,1);
PostQuitMessage(0);
return 0;
case WM_DESTROY: //윈도창 파기시
KillTimer(hWnd,1);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.