|
C++ 빌더X에서 컴파일 시꼈을때는 이런 메시지가 떳고요
iVscrollPos=max(0,min(iVscrollPos,NUMLINES - 1));
//"Unit1.cpp": E2268 Call to undefined function 'max' in function __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) at line 103
케헹 stdlib.h 헤더 파일을 추가해도 안 돼서 -_-;;;
define으로 매크로함수로 지정했더니 돼는군요
#define max(a,b) ((a)>(b) ? (a):(b))
#define min(a,b) ((a)<(b) ? (a):(a))
이렇게 말이지요
똑같은 비주얼 씨++에서 했더니 잘 돼더라고요 왜 그런지 아시는 분은 좀 알려주세요
소스첨부할께요 찰스펫조드 프로그래밍윈도우즈 챕터4에 sysmets2.c란 거예요
#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics[0]))
struct
{
int iIndex;
TCHAR *szLabel;
TCHAR *szDesc;
}
sysmetrics[]=
{
SM_CXSCREEN, TEXT("SM_CXSCREEN"),
TEXT("Screen width in pixels"),
SM_CYSCREEN, TEXT("SM_CYSCREEN"),
TEXT("Screen height in pixels"),
SM_CXVSCROLL, TEXT("SM_CXVSCROLL"),
TEXT("Vertical scroll width"),
SM_CYHSCROLL, TEXT("SM_CYHSCROLL"),
TEXT("Horizontal scroll height"),
SM_CYCAPTION, TEXT("SM_CYCAPTION"),
TEXT("Caption bar height"),
SM_CXBORDER, TEXT("SM_CXBORDER"),
TEXT("Window border height"),
SM_CXFIXEDFRAME,TEXT("SM_CXFIXEDFRAME"),
TEXT("Dialog window frame width"),
SM_CYFIXEDFRAME,TEXT("SM_CYFIXEDFRAME"),
TEXT("Dialog windwo frame height"),
SM_CYVTHUMB, TEXT("SM_CYVTHUMB"),
TEXT("Vertical scroll thumb height"),
SM_CXHTHUMB, TEXT("SM_CXHTHUMB"),
TEXT("Horizontal scroll thumb width"),
SM_CXICON, TEXT("SM_CXICON"),
TEXT("Icon width"),
SM_CYICON, TEXT("SM_CYICON"),
TEXT("Icon height"),
SM_CXCURSOR, TEXT("SM_CXCURSOR"),
TEXT("Cursor width"),
SM_CYCURSOR, TEXT("SM_CYCURSOR"),
TEXT("Cursor height"),
SM_CYMENU, TEXT("SM_CYMENU"),
TEXT("Menu bar height"),
SM_CXFULLSCREEN,TEXT("SM_CXFULLSCREEN"),
TEXT("Full screen client area width"),
SM_CYFULLSCREEN,TEXT("SM_CYFULLSCREEN"),
TEXT("Full screen client area width"),
SM_CYKANJIWINDOW,TEXT("SM_CYKANJIWINDOW"),
TEXT("Kanji window height"),
SM_MOUSEPRESENT,TEXT("SM_MOUSEPRESENT"),
TEXT("Mouse present flag"),
SM_CYVSCROLL, TEXT("SM_CYVSCROLL"),
TEXT("Vertical scroll arrow height"),
SM_CXHSCROLL, TEXT("SM_CXHSCROLL"),
TEXT("Horizontal scroll arrow width"),
SM_DEBUG, TEXT("SM_DEBUG"),
TEXT("Debug version flag"),
SM_SWAPBUTTON, TEXT("SM_SWAPBUTTON"),
TEXT("Mouse buttons swapped flag"),
SM_CXMIN, TEXT("SM_CXMIN"),
TEXT("Minimum window width"),
SM_CYMIN, TEXT("SM_CYMIN"),
TEXT("Minimum window height"),
SM_CXSIZE, TEXT("SM_CXSIZE"),
TEXT("Min/Max/Close button width"),
SM_CYSIZE, TEXT("SM_CYSIZE"),
TEXT("Min/Max/Close button height"),
SM_CXSIZEFRAME, TEXT("SM_CXSIZEFRAME"),
TEXT("Window sizing frame width"),
SM_CYSIZEFRAME, TEXT("SM_CYSIZEFRAME"),
TEXT("Min/Max/Close button height"),
SM_CXMINTRACK, TEXT("SM_CXMINTRACK"),
TEXT("Minimum window tracking width"),
SM_CXDOUBLECLK, TEXT("SM_CXDOUBECLK"),
TEXT("Double click x tolerance"),
SM_CYDOUBLECLK, TEXT("SM_CYDOUBECLK"),
TEXT("Double click y tolerance"),
SM_CXICONSPACING,TEXT("SM_CXICONSPACING"),
TEXT("Horizontal icon spacing"),
SM_CYICONSPACING,TEXT("SM_CYICONSPACING"),
TEXT("Vertical icon spacing"),
SM_MENUDROPALIGNMENT,TEXT("SM_MENUDRAPALIGNMENT"),
TEXT("Left or right menu drop"),
SM_DBCSENABLED, TEXT("SM_DBCSENABLED"),
TEXT("Doubl-Byte Char set enabled"),
SM_PENWINDOWS, TEXT("SM_PENWINDOWS"),
TEXT("Pen extensions installed"),
SM_CMOUSEBUTTONS,TEXT("SM_CMOUSEBUTTONS"),
TEXT("Numer of mouse button"),
SM_SECURE, TEXT("SM_SECURE"),
TEXT("Security present flag"),
SM_CXEDGE, TEXT("SM_CXEDGE"),
TEXT("3-D border width"),
SM_CYEDGE, TEXT("SM_CYEDGE"),
TEXT("3-D border height"),
SM_CXMINSPACING,TEXT("SM_CXMINSPACING"),
TEXT("Minimized window spacing width"),
SM_CYMINSPACING,TEXT("SM_CYMINSPACING"),
TEXT("Minimized window spacing height"),
SM_CXSMICON, TEXT("SM_CXSMICON"),
TEXT("Small Icon widht"),
SM_CYSMICON, TEXT("SM_CYSMICON"),
TEXT("Small Icon height"),
SM_CYSMCAPTION, TEXT("SM_CYSMCAPTION"),
TEXT("Small caption height"),
SM_CXSMSIZE, TEXT("SM_CYSMSIZE"),
TEXT("Small caption button width"),
SM_CYSMSIZE, TEXT("SM_CYSMSIZE"),
TEXT("Small caption button heihgt"),
SM_CXMENUSIZE, TEXT("SM_CXMENUSIZE"),
TEXT("Menu bar button width"),
SM_CYMENUSIZE, TEXT("SM_CYMENUSIZE"),
TEXT("Menu bar button height"),
SM_ARRANGE, TEXT("SM_ARRANGE"),
TEXT("How minimized windows arranged"),
SM_CXMINIMIZED, TEXT("SM_CXMINIMIZED"),
TEXT("Minimized window width"),
SM_CYMINIMIZED, TEXT("SM_CYMINIMIZED"),
TEXT("Minimized window height"),
SM_CXMAXTRACK, TEXT("SM_CXMAXTRACK"),
TEXT("Maximum draggable width"),
SM_CYMAXTRACK, TEXT("SM_CYMAXTRACK"),
TEXT("Maximum draggable height"),
SM_CXMAXIMIZED, TEXT("SM_CXMAXIMIZED"),
TEXT("Width of maximized window"),
SM_CYMAXIMIZED, TEXT("SM_CYMAXIMIZED"),
TEXT("Height of maximized window"),
SM_NETWORK, TEXT("SM_NETWORK"),
TEXT("Network present flag"),
SM_CLEANBOOT, TEXT("SM_CLEANBOOT"),
TEXT("How systm was booted"),
SM_CXDRAG, TEXT("SM_CXDRAG"),
TEXT("Avoid drag x tolerance"),
SM_CYDRAG, TEXT("SM_CYDRAG"),
TEXT("Avoid drag y tolerance"),
SM_SHOWSOUNDS, TEXT("SM_SHOWSOUNDS"),
TEXT("Present sounds visually"),
SM_CXMENUCHECK, TEXT("SM_CXMEUNCHECK"),
TEXT("Meun check-mark width"),
SM_CYMENUCHECK, TEXT("SM_CYMENUCHECK"),
TEXT("Menu check-mark height"),
SM_SLOWMACHINE, TEXT("SM_SHOWMACHINE"),
TEXT("Slow processor flag"),
SM_MIDEASTENABLED,TEXT("SM_MIDEASTENABLED"),
TEXT("Hebrew and Arabic enabled flag"),
SM_MOUSEWHEELPRESENT,TEXT("SM_MOUSEWHEELPRESENT"),
TEXT("Mouse wheel present flag"),
SM_XVIRTUALSCREEN,TEXT("SM_XVIRTUALSCREEN"),
TEXT("Virtual screen x orign"),
SM_YVIRTUALSCREEN,TEXT("SM_YVIRTUALSCREEN"),
TEXT("Virtual screen y origh"),
SM_CXVIRTUALSCREEN,TEXT("SM_CXVIRTUALSCREEN"),
TEXT("Virtual screen width"),
SM_CYVIRTUALSCREEN,TEXT("SM_CYVIRTUALSECREEN"),
TEXT("Virtual screen height"),
SM_CMONITORS, TEXT("SM_CMONITORS"),
TEXT("Number of monitors"),
SM_SAMEDISPLAYFORMAT,TEXT("SM_SAMEDISPLAYFORMAT"),
TEXT("Same color fomat flag")
};
//---------------------------------------------------------------------------
// Unit1.cpp
//---------------------------------------------------------------------------
#include <windows.h>
#include "Unit1.h"
LRESULT CALLBACK WndProc(HWND, UINT , WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[] = TEXT("SysMets2");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program 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,y;
PAINTSTRUCT ps;
TCHAR szBuffer[10];
TEXTMETRIC tm;
switch(message)
{
case WM_CREATE:
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:
cyClient = HIWORD(lParam);
return 0;
case WM_VSCROLL:
switch (LOWORD(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=max(0,min(iVscrollPos,NUMLINES - 1)); //이 부분이예욧
if(iVscrollPos != GetScrollPos(hwnd,SB_VERT))
{
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++)
{
y = cyChar * (i - iVscrollPos);
TextOut(hdc,0,y,
sysmetrics[i].szLabel,
lstrlen(sysmetrics[i].szLabel));
TextOut(hdc,22 * cxCaps,y,
sysmetrics[i].szDesc,
lstrlen(sysmetrics[i].szDesc));
SetTextAlign(hdc,TA_RIGHT | TA_TOP);
TextOut(hdc,22 * cxCaps + 40 * cxChar,y,szBuffer,
wsprintf(szBuffer,TEXT("%5"),
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);
}
|