Q&A

  • 한꺼번에 이렇게 많이 질문해도..

한꺼번에 이렇게 많이 질문해도 되는지...^^
너그럽게 봐 주시고 답변 부탁드립니다.
충성!!   ^-^;;
미리 감사드립니다 (_._)

아래는 콘솔프로그램 소스입니다.

***********************************************************

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



정말 제가 생각해도 모르는게 왜 이리 많은지... 쯔쯔쯔...
도와주십시요.
    
3  COMMENTS
  • Profile
    최용일 2003.03.07 23:10
    안녕하세요. 최용일입니다.

    질문①: 콘솔프로그램이라면서 API로 윈도우창은 왜 만드셨나요? 그럴바에야 그냥 델파이 폼에다가 하시는것이 훨씬 더 좋죠... 용도 구분이 되지 않는것은 님이 {$APPTYPE CONSOLE}를 써서 콘솔윈도우을 띄우게 하고 또 API로 윈도우창을 하나 더 만드셔서 그러네요. 어떤 프로그램을 만들것인가 구분을 확실하게 하세요... 콘솔프로그램이면 콘솔에다가 쓰시건가, 윈도우프로그램이면 콘솔어플로 만들지 마시던가...

    질문②: WM_GETMINMAXINFO를 사용해서 하실려는 의도는 맞는데. imsiMinMaxInfo에 다가 제약하려는 크기를 넣으시면 어떻게 합니까? TheMessage.LParam에다가 넣어야지 윈도우가 보고 판단하지.. 님이 만든 임시변수에 넣으면 어떻게 함니까...

    질문③: 이거는 F1(도움말)키 눌렀을 때 WM_HELP로 Translate되어 전달되므로 발생안하는게 맞는거 같구요...

    질문④: 이거는 소스 실행을 안해봐서 잘 모르겠구요...

    질문⑤, ⑥: 이거는 LoadIcon, LoadCursor를 써서 실행파일의 리소스에서 찾으라고 했으면서 리소스 링크하는 부분($R)이 프로젝트리소스밖에 없는거같네요... 실행파일과 같은 폴더에 리소스파일이 있어도 링크를 안해주면 헛것입니다. {$R 리소스파일이름} 을 써서 링크해주세요...

    ^^ 항상 즐코하세요...

  • Profile
    맑은물 2003.03.08 00:01
    답변 너무 감사드리구요...

    질문②의 답변에서
    TheMessage.LParam에 넣으라구 하셨는데,
    어떻게 하는지 잘 모르겠습니다.

    질문③의 경우는,
    F1부터 F12까지는 물론, RETURN키도 안되는군요...
    왜 그럴까요?

    질문⑤, ⑥의 경우는,
    {$R c:testtest.res}
    라구 해서 컴파일하니,
    RLINK32 Unsupported 16bit resource in file c:testtest.res
    라구 에러가 나오네요.
    {$R test.res} 도 마찬가지구요

    잘 몰라서 재차 질문드리니
    답변좀 부탁드려두 될까요?


    좋은 주말 되십시요.


  • Profile
    최용일 2003.03.08 03:21
    안녕하세요. 최용일입니다.

    2번은  아래와 같이 한줄만 바꾸어주시면 될겁니다.
    imsiMinMaxInfo := Pointer(LParam);
    제가 자세히 보지 않고 답변을 해드렸군요... 죄송...

    3번의 경우는 저도 잘 모르겠네요. 직접실행을 해봐야 하는데. 그럴 여건은 안되어서...

    5,6번은 리소스파일이 16비트인가 보네요... 16비트리소스는 윈도우3.1에서 쓰던걸로 델파이(아마 3부터)에서는 사용하지 않습니다. 32비트 리소스를 쓰세요... 델파이 Bin폴더에 보시면 brcc32.exe라는 32비트리소스를 만들어주는 넘이 있습니다. 이걸 이용하셔두 됩니다.

    ^^ 항상 즐코하세요...