한꺼번에 이렇게 많이 질문해도 되는지...^^
너그럽게 봐 주시고 답변 부탁드립니다.
충성!! ^-^;;
미리 감사드립니다 (_._)
아래는 콘솔프로그램 소스입니다.
***********************************************************
program Project2;
{$APPTYPE CONSOLE} // ①
uses
Windows,
Messages,
SysUtils,
Graphics;
{$R *.res}
var
nX,nY:Integer;
cX,cY:Integer;
function WindowProc(TheWindow:HWND;TheMessage:UINT; WParam:WPARAM; LParam: LPARAM): Longint; stdcall; export;
var
imsiMinMaxInfo:^MINMAXINFO;
imsiHBRUSH:HBRUSH;
imsiDC:HDC;
imsips:PAINTSTRUCT;
begin
case TheMessage of
WM_GETMINMAXINFO // ②
:begin
imsiMinMaxInfo := @LParam;
imsiMinMaxInfo.ptMinTrackSize.x :=300;
imsiMinMaxInfo.ptMinTrackSize.y :=150;
imsiMinMaxInfo.ptMaxTrackSize.x :=300;
imsiMinMaxInfo.ptMaxTrackSize.y :=150;
Exit;
end;
WM_KEYDOWN
:begin
Case LOWORD(WParam) of
VK_F1:begin // ③
nX:=100; nY:=100;
imsiDC:=BeginPaint(TheWindow,imsips);
SetTextAlign(imsiDC,TA_TOP or TA_RIGHT);
SetTextColor(imsiDC,RGB(255,255,0));
SetBkColor(imsiDC,RGB(255,0,0));
TextOut(imsiDC,nX,nY,PChar('이것은 '),6);
nY:=nY+20;
TextOut(imsiDC,nX,nY,PChar('책'),2);
nY:=nY+20;
TextOut(imsiDC,nX,nY,PChar('입니다'),10);
EndPaint(TheWindow,imsips);
Exit;
end;
VK_F8:begin
imsiHBRUSH := CreateSolidBrush(RGB(0,0,125)); // ④
SetClassLong(TheWindow,GCL_HBRBACKGROUND,imsiHBRUSH);
DeleteObject(imsiHBRUSH);
InvalidateRect(TheWindow,nil,TRUE);
Exit;
end;
end;
end;
WM_DESTROY
:begin
PostQuitMessage(0);
Exit;
end;
end;
Result := DefWindowProc(TheWindow, TheMessage, WParam, LParam)
end;
function RegisterClass:Boolean;
var
WindowClass:TWndClass;
begin
WindowClass.Style := CS_HREDRAW or CS_VREDRAW;
WindowClass.lpfnWndProc := @WindowProc ;
WindowClass.cbClsExtra := 0;
WindowClass.cbWndExtra := 0;
WindowClass.hInstance := hInstance;
WindowClass.hIcon := LoadIcon(hInstance,'MyIcon'); // ⑤
WindowClass.hCursor := LoadCursor(hInstance,'MyCursor'); // ⑥
WindowClass.hbrBackground := COLOR_WINDOW;
WindowClass.lpszMenuName := nil;
WindowClass.lpszClassName:= PChar('test');
Result := Windows.RegisterClass(WindowClass) <>0 ;
end;
var
TheMessage:TMsg;
hWindow:HWND;
begin
if not RegisterClass then
begin
messageBox(0,'RegisterClass Failed',nil,MB_OK);
Exit;
end;
hWindow := CreateWindow(PChar('test'),
PChar('test'),
WS_OVERLAPPEDWINDOW or WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
hInstance,
nil
);
if hWindow = 0 then
begin
messageBox(0,'CreateWindow Failed',nil,MB_OK);
Exit;
end;
While GetMessage(TheMessage,0,0,0) do
begin
TranslateMessage(TheMessage);
DispatchMessage(TheMessage);
end;
end.
***********************************************************
>> 전질문 컴파일 에러는 발생하지 않습니다. 실행이 되지 않을 뿐입니다.
질문①
실행시키면, 콘솔창과 윈도우창이 같이 뜨는데, 뜬 콘솔창으로 뭘 하라는겁니까?
말투가 이상한가..;;;;
싸움거는거 아닙니다. ^^
둘의 용도 구분이 되지 않습니다..
질문②
윈도우창의 크기를 300,150으로 고정해, 변경하지 못하게 하려는데,
이 부분이 실행되지 않습니다.
질문③
역시 실행이 되지 않습니다
질문④
실행은 되는데 제대로 동작하지 않습니다
다음의 어느 구문으로 실행시켜도 배경색은 항상 흰색입니다.
예를 들어,
imsiHBRUSH := CreateSolidBrush(RGB(0,0,0)); // 검정색
imsiHBRUSH := CreateSolidBrush(RGB(255,0,0)); // 빨간색
imsiHBRUSH := CreateSolidBrush(RGB(0,0,255)); // 파란색
질문⑤⑥
역시 실행이 되질 않습니다
실행시키면 커서가 모래시계 상태로 한참을 있다가 원래대로 돌아와 버립니다.
아마도 리소스 파일을 찾다가, 시간도 걸릭고, 없으니까 디폴트로 표시되어
버리는 듯 한데... 완전히 제생각입니다. ^^
참고로, 리소스파일은 프로젝트파일과 같은 디렉토리에 존재하구요..
내용은, 다음과 같습니다.
MyCursor Cursor "c:testCursor1.cur"
MyIcon Icon "c:testIcon1.ico"
물론, Cursor1.cur 와 Icon1.ico도 같은 디렉토리에 보기좋게 있습니다.
다음과 같이도 해보았지만 안되더군요
WindowClass.hIcon := LoadIcon(hInstance,PChar('MyIcon'));
WindowClass.hCursor := LoadCursor(hInstance,PChar('MyCursor'));
정말 제가 생각해도 모르는게 왜 이리 많은지... 쯔쯔쯔...
도와주십시요.
질문①: 콘솔프로그램이라면서 API로 윈도우창은 왜 만드셨나요? 그럴바에야 그냥 델파이 폼에다가 하시는것이 훨씬 더 좋죠... 용도 구분이 되지 않는것은 님이 {$APPTYPE CONSOLE}를 써서 콘솔윈도우을 띄우게 하고 또 API로 윈도우창을 하나 더 만드셔서 그러네요. 어떤 프로그램을 만들것인가 구분을 확실하게 하세요... 콘솔프로그램이면 콘솔에다가 쓰시건가, 윈도우프로그램이면 콘솔어플로 만들지 마시던가...
질문②: WM_GETMINMAXINFO를 사용해서 하실려는 의도는 맞는데. imsiMinMaxInfo에 다가 제약하려는 크기를 넣으시면 어떻게 합니까? TheMessage.LParam에다가 넣어야지 윈도우가 보고 판단하지.. 님이 만든 임시변수에 넣으면 어떻게 함니까...
질문③: 이거는 F1(도움말)키 눌렀을 때 WM_HELP로 Translate되어 전달되므로 발생안하는게 맞는거 같구요...
질문④: 이거는 소스 실행을 안해봐서 잘 모르겠구요...
질문⑤, ⑥: 이거는 LoadIcon, LoadCursor를 써서 실행파일의 리소스에서 찾으라고 했으면서 리소스 링크하는 부분($R)이 프로젝트리소스밖에 없는거같네요... 실행파일과 같은 폴더에 리소스파일이 있어도 링크를 안해주면 헛것입니다. {$R 리소스파일이름} 을 써서 링크해주세요...
^^ 항상 즐코하세요...