Windows 학습 노트--SYSMETS2
코드 설명은 다음과 같습니다.
- //SYSMETS2.cpp
- #include<windows.h>
- #include"sysmets.h"
-
- LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
-
-
- int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- PSTR szCmdLine,
- int iCmdShow)
- {
- static TCHAR szAppName[]=TEXT("SysMets2");
- HWND hWnd;
- MSG msg;
- WNDCLASS wndclass;
-
- // 10
- wndclass.cbClsExtra=0;
- wndclass.cbWndExtra=0;
-
- wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
-
- wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
- wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
-
- wndclass.hInstance=hInstance;
-
- wndclass.lpfnWndProc=WndProc; //
- wndclass.lpszClassName=szAppName; //
-
- wndclass.lpszMenuName=NULL;
-
- wndclass.style=CS_HREDRAW|CS_VREDRAW;
-
- //
- int retVal=RegisterClass(&wndclass); // , 0; , 0
- if(retVal == 0)
- {
- MessageBox(NULL,TEXT("This progrom requires Windows NT !"),szAppName,MB_ICONERROR);
- return 0;
- }
-
- //
- hWnd=CreateWindow(szAppName,
- TEXT("Get System Metrics No.2"),
- WS_OVERLAPPEDWINDOW | WS_VSCROLL,
- CW_USEDEFAULT,CW_USEDEFAULT,
- CW_USEDEFAULT,CW_USEDEFAULT,
- NULL,NULL,hInstance,NULL);
-
- ShowWindow(hWnd,iCmdShow);
- UpdateWindow(hWnd);
-
- //
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
-
-
- return msg.wParam;
- }
-
- LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
- {
- static int cxChar,cxCaps,cyChar,cyClient,iVscrollPos;
- HDC hdc;
- int i;
- PAINTSTRUCT ps;
- TCHAR szBuffer[10];
- TEXTMETRIC tm;
-
- //
- switch(message){
-
- case WM_CREATE: //CreateWindows , ( API , )
- hdc=GetDC(hWnd);
-
- GetTextMetrics(hdc,&tm);
- cxChar=tm.tmAveCharWidth;
- cxCaps=(tm.tmPitchAndFamily & 1? 3:2)* cxChar/2;
- cyChar=tm.tmHeight+tm.tmExternalLeading;
-
- ReleaseDC(hWnd,hdc);
-
- //
- SetScrollRange(hWnd,SB_VERT,0,NUMLINES-1,FALSE);
- SetScrollPos(hWnd,SB_VERT,iVscrollPos,TRUE);
- return 0;
-
- case WM_SIZE: //( , ; WM_PAINT )
- cyClient=HIWORD(lParam); //lParam: , ; , .
- return 0;
-
- case WM_VSCROLL:
- switch(LOWORD(wParam)) //wParam: ,
- {
- case SB_LINEUP:
- iVscrollPos-=1;
- break;
- case SB_LINEDOWN:
- iVscrollPos+=1;
- break;
- case SB_PAGEUP:
- iVscrollPos-=cyClient/cyChar;
- break;
- case SB_PAGEDOWN:
- iVscrollPos+=cyClient/cyChar;
- break;
-
- case SB_THUMBPOSITION:
- iVscrollPos=HIWORD(wParam); // , ( )
- break;
- default:
- break;
- }
-
- // , iVscrollPos
- iVscrollPos=max(0,min(iVscrollPos,NUMLINES-1));
- if(GetScrollPos(hWnd,SB_VERT) != iVscrollPos)
- {
- SetScrollPos(hWnd,SB_VERT,iVscrollPos,TRUE);
- InvalidateRect(hWnd,NULL,TRUE);
- }
- return 0;
-
-
- case WM_PAINT:
- hdc=BeginPaint(hWnd,&ps);
-
-
- for(i=0;i<NUMLINES;i++)
- {
- TextOut(hdc,0,cyChar*(i-iVscrollPos),sysmetrics[i].szLabel,lstrlen(sysmetrics[i].szLabel));
- TextOut(hdc,22*cxCaps,cyChar*(i-iVscrollPos),sysmetrics[i].szDesc,lstrlen(sysmetrics[i].szDesc));
-
- SetTextAlign(hdc,TA_LEFT|TA_TOP);
- TextOut(hdc,
- 22*cxCaps+40*cxChar,cyChar*(i-iVscrollPos),
- szBuffer,wsprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex)));
- SetTextAlign(hdc,TA_LEFT|TA_TOP);
- }
-
- EndPaint(hWnd,&ps);
- return 0;
-
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- }
-
- return DefWindowProc(hWnd,message,wParam,lParam);
- }
함수 프로토타입:
1.
ATOM RegisterClass(
const WNDCLASS* lpWndClass
);
typedef WORD ATOM;
typedef unsigned short WORD;
2.
BOOL InvalidateRect(
HWND hWnd,
const RECT* lpRect,
BOOL bErase
);
const RECT* lpRect,//는 NULL이며, 전체 클라이언트 영역이 업데이트 영역임을 나타냅니다.
BOOL bErase//TRUE인 경우 배경색을 지웁니다.그렇지 않으면 지우지 않습니다.
3.
BOOL SetScrollRange(
HWND hWnd,
int nBar,
int nMinPos,
int nMaxPos,
BOOL bRedraw
);
int nBar, //SB_VERT | SB_HORZ BOOL bRedraw//일반적으로 스크롤 막대의 범위는 다시 그릴 필요가 없습니다.
int SetScrollPos(
HWND hWnd,
int nBar,
int nPos,
BOOL bRedraw
);
업데이트할 때마다 BOOL bRedraw//슬라이더의 위치를 다시 그려야 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.