본문 바로가기
코스웨어/15년 스마트컨트롤러

20151116-주재민-win32API_3일차

by 알 수 없는 사용자 2015. 11. 16.
728x90
반응형

 lsprintf

유니코드 지원한다.

 

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass = (LPSTR)TEXT("TextOut");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst = hInstance;

 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)WndProc;
 WndClass.lpszClassName = (LPCWSTR)lpszClass;
 WndClass.lpszMenuName = NULL;
 WndClass.style = CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd = CreateWindow(lpszClass, (LPCWSTR)lpszClass, WS_OVERLAPPEDWINDOW,
  100, 100, 500, 500,
  NULL, (HMENU)NULL, hInstance, NULL);
 ShowWindow(hWnd, nCmdShow);

 while (GetMessage(&Message, 0, 0, 0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 static int x;
 static int y;
 static WCHAR wcBuffer[100];

 switch (iMessage)
 {
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  //SetTextAlign(hdc, TA_CENTER);
  TextOut(hdc, x, y, wcBuffer, lstrlen(wcBuffer));
  EndPaint(hWnd, &ps);
  return 0;
 case WM_MOUSEMOVE:
  hdc = GetDC(hWnd);
  MoveToEx(hdc, x, y, NULL);
  x = LOWORD(lParam);
  y = HIWORD(lParam);
  wsprintf(wcBuffer, "x는 %d, y는 %d이다.", x, y);  //s:메모리에 출력한다, ls:유니코드 지원함수이다.
  InvalidateRect(hWnd, NULL, TRUE);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

 

실행 결과

마우스 포인터를 따라 움직인다.

 

4-2-. 더블클릭

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass = (LPSTR)TEXT("TextOut");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst = hInstance;

 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)WndProc;
 WndClass.lpszClassName = (LPCWSTR)lpszClass;
 WndClass.lpszMenuName = NULL;
 WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
 RegisterClass(&WndClass);

 hWnd = CreateWindow(lpszClass, (LPCWSTR)lpszClass, WS_OVERLAPPEDWINDOW,
  100, 100, 500, 500,
  NULL, (HMENU)NULL, hInstance, NULL);
 ShowWindow(hWnd, nCmdShow);

 while (GetMessage(&Message, 0, 0, 0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 static int x;
 static int y;
 static WCHAR wcBuffer[100];

 switch (iMessage)
 {
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  //SetTextAlign(hdc, TA_CENTER);
  TextOut(hdc, x, y, wcBuffer, lstrlen(wcBuffer));
  EndPaint(hWnd, &ps);
  return 0;
 case WM_MOUSEMOVE:
  hdc = GetDC(hWnd);
  MoveToEx(hdc, x, y, NULL);
  x = LOWORD(lParam);
  y = HIWORD(lParam);
  wsprintf(wcBuffer, "x는 %d, y는 %d이다.", x, y);  //s:메모리에 출력한다, ls:유니코드 지원함수이다.
  InvalidateRect(hWnd, NULL, TRUE);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_LBUTTONDBLCLK:
  InvalidateRect(hWnd, NULL, TRUE);
  PostQuitMessage(0);
  return 0;

 }
 return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

case WM_CREATE:
  hTimer=(HANDLE)SetTimer(hWnd,1,1000,NULL);
  str="";
  return 0;
case WM_TIMER:
  time(&mytime);//현재 시간 알아냄
  str=ctime(&mytime);//계산해서 글자로 알아냄
  InvalidateRect(hWnd,NULL,TRUE);
  return 0;


case WM_DESTROY:
  KillTimer(hWnd,1);//2번째 인자 번호가 일치해야됨
  PostQuitMessage(0);
  return 0;

 

4-3-.타이머

#include <windows.h>

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_hInst;

LPSTR lpszClass="MyTimer";

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

,LPSTR lpszCmdParam,int nCmdShow)

{

HWND hWnd;

MSG Message;

WNDCLASS WndClass;

g_hInst=hInstance;

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)WndProc;

WndClass.lpszClassName=lpszClass;

WndClass.lpszMenuName=NULL;

WndClass.style=CS_HREDRAW | CS_VREDRAW;

RegisterClass(&WndClass);

 

hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

NULL,(HMENU)NULL,hInstance,NULL);

ShowWindow(hWnd,nCmdShow);

while(GetMessage(&Message,0,0,0)) {

TranslateMessage(&Message);

DispatchMessage(&Message);

}

return Message.wParam;

}

 

#include

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT ps;

time_t mytime;

static HANDLE hTimer;

static char *str;

switch(iMessage) {

case WM_CREATE:

hTimer=(HANDLE)SetTimer(hWnd,1,1000,NULL);

str="";

return 0;

case WM_TIMER:

time(&mytime);

str=ctime(&mytime);

InvalidateRect(hWnd,NULL,TRUE);

return 0;

case WM_PAINT:

hdc=BeginPaint(hWnd,&ps);

TextOut(hdc,100,100,str,strlen(str)-1);

EndPaint(hWnd,&ps);

return 0;

case WM_DESTROY:

KillTimer(hWnd,1);

PostQuitMessage(0);

return 0;

}

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

 

이걸로 하면 잘됨. 공유파일

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT ps;

SYSTEMTIME st;

static TCHAR sTime[128];

 

switch (iMessage)

{

case WM_CREATE:

SetTimer(hWnd,1,1000,NULL);

return 0;

case WM_TIMER:

GetLocalTime(&st);

wsprintf (sTime

,TEXT("지금 시간은 %d:%d:%d입니다")

,st.wHour

,st.wMinute

,st.wSecond);

InvalidateRect(hWnd,NULL,TRUE);

return 0;

case WM_PAINT:

hdc=BeginPaint(hWnd,&ps);

TextOut(hdc,100,100,sTime,lstrlen(sTime));

EndPaint(hWnd,&ps);

return 0;

case WM_DESTROY:

KillTimer(hWnd,1);

PostQuitMessage(0);

return 0;

}

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

 

long FAR PASCAL WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
time_t mytime;
static HANDLE hTimer, hTimer2;
static char *str;
static RECT rt={100,100,400,120};
switch(iMessage) {
case WM_CREATE:
hTimer=(HANDLE)SetTimer(hWnd,1,1000,NULL);
hTimer2=(HANDLE)SetTimer(hWnd,2,5000,NULL);
str="";
SendMessage(hWnd, WM_TIMER, 1, 0);
return 0;
case WM_TIMER:
switch (wParam) {
case 1:
time(&mytime);
str=ctime(&mytime);
InvalidateRect(hWnd,&rt,TRUE);
break;
case 2:
MessageBeep(MB_OK);
break;
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,100,100,str,strlen(str)-1);
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
KillTimer(hWnd,1);
KillTimer(hWnd,2);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

 

 

4-4-나. 작업 영역

 BOOL GetClientRect( HWND hWnd, LPRECT lpRect);

작업창의 크기를 알아내는 함수이다.

 

6.0이하 버전은 웹페이지와 비슷하다.

지금 visual studio는 조금 다르다.

 

5-2-가. 리소스 작성

메뉴이름은 알아서 정한다.

 

하위 메뉴는 40000번 부터 시작한다.

자동으로 번호가 부여된다. 무조건 일괄적으로 부여.

 

5-3 아이콘, 커서

#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass = TEXT("Menu");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
 , LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst = hInstance;

 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)WndProc;
 WndClass.lpszClassName = lpszClass;
 WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);

 WndClass.style = CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  NULL, (HMENU)NULL, hInstance, NULL);
 ShowWindow(hWnd, nCmdShow);

 while (GetMessage(&Message, 0, 0, 0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 switch (iMessage) {
 case WM_COMMAND:
  switch (LOWORD(wParam))
  {
  case ID_FILE_MENU1:
   MessageBox(hWnd, TEXT("첫 번째 메뉴를 선택했습니다."), TEXT("Menu Demo"), MB_OK);
   break;
  case ID_FILE_MENU2:
   MessageBox(hWnd, TEXT("두 번째 메뉴를 선택했습니다."), TEXT("Menu Demo"), MB_OK);
   break;
  case ID_FILE_EXIT:
   PostQuitMessage(0);
   break;
  }
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 default:
  return(DefWindowProc(hWnd, iMessage, wParam, lParam));
 }
}

 

 

 

728x90