'Study/API'에 해당되는 글 37건

  1. 2008/12/22 GDI+ 사용 스레드.
  2. 2007/12/11 Registry wrapping class (2)
  3. 2007/12/05 API - TIP
  4. 2007/10/13 10.2(화) 이론-1
  5. 2007/10/13 10.2(화) 실습-1
  6. 2007/10/13 10.1(월) 이론-2
  7. 2007/10/13 10.1(월) 이론-1
  8. 2007/10/13 10.1(월) 실습-1
  9. 2007/10/13 9.21(금) 이론-1
  10. 2007/10/10 9.21(금) 실습-1

GDI+ 사용 스레드.

from Study/API 2008/12/22 16:28 view 47483
1. GDI+ 기본정의

#pragma comment (lib, "gdiplus.lib")

#include <gdiplus.h>
using namespace Gdiplus;

 ULONG_PTR gpToken;
 GdiplusStartupInput gpsi;
VERIFY(GdiplusStartup( &gpToken, &gpsi, NULL ) == Ok );
//////////////////////////////////////////////////////////////////////
// Grahpics g;
////////////////////////////////////////////////////////////////////

GdiplusShutdown(gpToken);


2. MFC 에서 GDI+를 사용하기 위한 정의
 PRB: Microsoft Foundation Classes DEBUG_NEW Does Not Work with GDI+
" error C2660: 'Gdiplus::GdiplusBase::operator new' : 함수는 3개의 매개 변수를 사용하지 않습니다. "

#define ULONG_PTR DWORD
//// Ensure that GdiPlus header files work properly with MFC DEBUG_NEW and STL header files.
#define iterator _iterator

#ifdef _DEBUG

namespace Gdiplus
{
    namespace DllExports
    {
#include "GdiplusMem.h"
    };
#ifndef _GDIPLUSBASE_H
#define _GDIPLUSBASE_H
    class GdiplusBase
    {
    public:
        void (operator delete)(void* in_pVoid)
        {
            DllExports::GdipFree(in_pVoid);
        }
        void* (operator new)(size_t in_size)
        {
            return DllExports::GdipAlloc(in_size);
        }
       
        void (operator delete[])(void* in_pVoid) { DllExports::GdipFree(in_pVoid); } void* (operator new[])(size_t in_size)
        {
            return DllExports::GdipAlloc(in_size);
        }
       
        void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine)
        {
            return DllExports::GdipAlloc(nSize);
        }
       
        void operator delete(void* p, LPCSTR lpszFileName, int nLine)
        {
            DllExports::GdipFree(p);
        }
       
    };
#endif // #ifndef _GDIPLUSBASE_H
}
#endif // #ifdef _DEBUG

#include "GdiPlus.h"
using namespace Gdiplus;
#undef iterator
    //// Ensure that Gdiplus.lib is linked.
#pragma comment(lib, "gdiplus.lib")


3. 알수 없는 에러가 쭉 나오는 현상..
//MFC를 사용하지 않는 경우에 컴파일 시간을 줄이기 위해 정의한다.(GDI+ 에러남.)
#define WIN32_LEAN_AND_MEAN  // 원흉의 매크로~주석처리~



4. 유용한 사이트
  1) winapi.co.kr/gdi+
Tag |

Registry wrapping class

from Study/API 2007/12/11 21:24 view 23124
1. Registry.h
/** \file Registry.h
**    \date  2007/12/11
**    \author kimjunju@hotmail.com
**/

#pragma once

/**    \class CRegistry
    \brief 레지스트리를 관리하는 클래스
*/


/** \ingroup  UTIL */

class CRegistry
{
public:
    CRegistry(void);
    virtual ~CRegistry(void);
public:
    BOOL Open(HKEY rootKey, LPCTSTR subKey);
    BOOL Close(void);

    BOOL CreateKey(HKEY rootKey, LPCTSTR subKey);
    BOOL DeleteKey(HKEY rootKey, LPCTSTR subKey);

    BOOL SetValue(LPCTSTR valueName, LPCTSTR value);
    BOOL SetValue(LPCTSTR valueName, DWORD value);
    BOOL SetValueForMultiSz(LPCTSTR valueName, LPCTSTR value, DWORD byteLength);

    BOOL GetValue(LPCTSTR valueName, LPCTSTR value, LPDWORD bufferLength);
    BOOL GetValue(LPCTSTR valueName, LPDWORD value);

    BOOL DeleteValue(LPCTSTR valueName);
private:
    HKEY    mRootKey;
    BOOL    mIsOpened;
};

2. Registry.cpp
#include "stdafx.h"
#include "Registry.h"

CRegistry::CRegistry(void)
{
    mRootKey    = NULL;
    mIsOpened    = FALSE;
}

CRegistry::~CRegistry(void)
{
}

BOOL CRegistry::Open(HKEY rootKey, LPCTSTR subKey)
{
    if (!subKey)
        return FALSE;

    if (mIsOpened)
        return FALSE;

    if (RegOpenKey(rootKey, subKey, &mRootKey) != ERROR_SUCCESS)
        return FALSE;

    mIsOpened = TRUE;

    return TRUE;
}

BOOL CRegistry::Close(void)
{
    if (RegCloseKey(mRootKey) != ERROR_SUCCESS)
        return FALSE;

    mIsOpened = FALSE;

    return TRUE;
}

BOOL CRegistry::CreateKey(HKEY rootKey, LPCTSTR subKey)
{
    if (!subKey)
        return FALSE;
   
    if (mIsOpened)
        return FALSE;

    if (RegCreateKey(rootKey, subKey, &mRootKey) != ERROR_SUCCESS)
        return FALSE;

    mIsOpened = TRUE;

    return TRUE;
}

BOOL CRegistry::DeleteKey(HKEY rootKey, LPCTSTR subKey)
{
    if (!subKey)
        return FALSE;

    if (RegDeleteKey(rootKey, subKey) != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

BOOL CRegistry::SetValue(LPCTSTR valueName, LPCTSTR value)
{
    if (!valueName || !value)
        return FALSE;

    if (!mIsOpened)
        return FALSE;

    if (RegSetValueEx(mRootKey, valueName, 0, REG_SZ, (BYTE*) value, (DWORD) _tcslen(value) * sizeof(TCHAR))
        != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

BOOL CRegistry::SetValueForMultiSz(LPCTSTR valueName, LPCTSTR value, DWORD byteLength)
{
    if (!valueName || !value)
        return FALSE;

    if (!mIsOpened)
        return FALSE;

    if (RegSetValueEx(mRootKey, valueName, 0, REG_MULTI_SZ, (BYTE*) value, byteLength)
        != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

BOOL CRegistry::SetValue(LPCTSTR valueName, DWORD value)
{
    if (!valueName)
        return FALSE;

    if (!mIsOpened)
        return FALSE;

    if (RegSetValueEx(mRootKey, valueName, 0, REG_DWORD, (BYTE*) &value, sizeof(DWORD))
        != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

BOOL CRegistry::GetValue(LPCTSTR valueName, LPCTSTR value, LPDWORD bufferLength)
{
    DWORD ValueType = 0;

    if (!valueName || !value || !bufferLength)
        return FALSE;

    if (!mIsOpened)
        return FALSE;

    if (RegQueryValueEx(mRootKey, valueName, 0, &ValueType, (BYTE*) value, bufferLength)
        != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

BOOL CRegistry::GetValue(LPCTSTR valueName, LPDWORD value)
{
    DWORD    ValueType        = 0;
    DWORD    BufferLength    = sizeof(DWORD);

    if (!valueName || !value)
        return FALSE;

    if (!mIsOpened)
        return FALSE;

    if (RegQueryValueEx(mRootKey, valueName, 0, &ValueType, (BYTE*) value, &BufferLength)
        != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

BOOL CRegistry::DeleteValue(LPCTSTR valueName)
{
    if (!valueName)
        return FALSE;

    if (!mIsOpened)
        return FALSE;

    if (RegDeleteValue(mRootKey, valueName) != ERROR_SUCCESS)
        return FALSE;

    return TRUE;
}

API - TIP

from Study/API 2007/12/05 23:05 view 24434
1. SendMessage (hList, LB_SETTOPINDEX, n, 0); - ListBox Control 에서 스크롤 맨아래로 내린다.

Tag |

10.2(화) 이론-1

from Study/API 2007/10/13 15:36 view 29121
1. 메뉴바 => 팝업 메뉴 => 메뉴 아이템
 
  - 메뉴바도 하나의 윈도우기 때문에 구조체를 갖는다. ( MENUINFO )
  - 마찬가지로 팝업메뉴도 하나의 윈도우이기 때문에 구조체를 갖는다. ( MENUITEMINFO )
 
2. 적재 방법

  - 윈도우 클래스에 바로 등록한다. wc.lpszMenuName
  - CreateWindowEx 10번쨰 인자에 준다. HMENU( 핸들을 등록해준다. )
  - 윈도우 생성 후 SetMenu() GetMenu() 로 등록해준다.
  - 임의로 메뉴바를 추가 했을 때는 rc에서 아이디추가, 다음 가르킬 ID를 변경 해줘야 한다.

3. 메뉴윈도우가 부모에게 보내주는 메시지.

  - WM_INITMENU
  - WM_INITPOPUPMENU : 'v' 메뉴항목의 체크작업 해줄 수 있다.
  - WM_MENUSELECT : 메뉴설명을 상태방에 추가 할 수 있다.
  - WM_COMMAND : 메뉴를 선택 했을 때 메뉴의 메시지 처리함수에서 부모에게 메세지를 보내준다.

4. ModifyMenu

  - 최근 사용한 파일을 표현할 수도 있다.(추후구현) : AppendMenu, DrawMenuBar (레지스터리 참조)
  - 윈도우즈는 모든 구성요소를 구조체로 만든 Object-Based 이므로 구조체만 수정해주면 된다.

5. 메뉴 OWNERDRAW

  - 색변경
    1) WM_CTLCOLOR 에서 처리한다.
    2) OWERDRAW : 메뉴, 기본컨트롤 - 결국 UI만 대신 그려주는 역할. 동작은 클래스내부에서 처리한다.
    3) CustomDraw : 공용 컨트롤에 적용

  - MF_OWNERDRAW : 속성으로 변경을 한다. ( ModifyMenu )
  - WM_MEASUREITEM : 그릴 항목의 크기를 지정해달라는 MSG를 OS가 보낸다. 열릴때 최초 1회발생
  - WM_DRAWITEM : 사용자가 그려 주라는 메시지로 HDC(lParam) 와 기타 모든 정보가 넘어온다.
  - LPDRAWITEMSTRUCT 현재 state를 조사할 수 있다.

6. Context Menu

  - WM_RBUTTONUP 생성 => 처리 하지 않는 메시지는 DefProc로 보내줘야 한다.
  - WM_CONTEXTMENU
    1) Context메뉴 리소스 제작시 _MENU로 이름을 주어 구분한다. OWNERDRAW를 적용받지 못한다.

  - 스크린 좌표로 넘어온다.( 클라이언트좌표로 변환 )
  - WM_COMMAND에서 명령을 처리하면 된다.


7. Dialog 공용 컨트롤 ( #32770 에 등록 )

  - DialogBox() => CreateWindow를 내부적으로 호출한다. 자기만의 메시지 루프를 가진다.
  - DlgProc() 사용자정의 함수로 메시지를 전달 해주게 된다.
  - 전달해 주는 메시지는 정해 져있다.( WndProc 과 엇비슷 )
  - WM_INITDIALOG : WM_CREATE를 수행한 후에 초기상태를 정하라는 메시지!!!
  - 특정키를 막거나 메시지를 가로 채려면 여기서 하는게 아니라 서브클래싱 해줘야 한다.!!

사용자 삽입 이미지

DlgProc()
    EndDialog() // 내부적으로 미리 약속되어 있는
                      // 탈출작업을 한다.

WndProc()
  : DialogBox : Blocking 된다.

DialogBox()
1) CreateWindowEx() 다이얼로그 생성
2) EnableWindow( 부모, FALSE ) 부모 블럭
3) WM_INITDIALOG 발생
4) 메시지 루프 Dispatch로 메시지 받아옴
5) 부모 Enable 후 다이얼로그 파괴

4)부가설명 - 메시지 박스가 내부적으로 메시지 루프를 갖는것과 같다. 이때 Dispatch 에서 Message를 DlgProc으로 보내준다.

- DialogBox는 내부적으로 DialogBoxParam을 호출 한다 lParam을 0L로 주는것에 불과한 매크로이다!! 호환성위해..





8. Dialog값 꺼내오기

  - 핸들을 알아야 윈도우의 값을 얻어오므로 ID로부터 핸들을 얻어야 한다. GetDlgItem( ID ) 로 얻어온다!!
  - GetDlgItem + GetWindowLong = GetDlgItemText  해당 컨트롤로부터 int값을 buf로 읽어 올수 있다.

  - DialogBoxParam() : lParam으로 특정데이터를 넘길 수 있다. 전역변수 대신에 포인터로 접근하는것!!
  - 이를 사용하면 Dialog에서 사용한 컨트롤의 값들을 lParam에 저장해두면 부모가 값을 읽어오는것이다.

9 모달리스
 
  - 생성과정 : DialogBox 를 CreateDialog 로 생성 해줘야 한다.
  - 파괴는 EndDialog =>  DestroyWindow() 취소버튼을 눌렀을때 파괴~
  - 이방식은 DlgProc() 에서 사용자정의 메시지를 WndProc() 로 보내 작업을 수행하도록 할 수 있다.
  - 메시지 루프가 없으므로 부모윈도우가 같은 메시지 루프를 사용한다.
  - 그러므로 Dialog에서 특정키등을 가로채서 모달리스에 전달 하고자 할 떄는 메시지루프를 수정한다.
        if ( !IsWindow( g_hDlg ) || !IsDialogMessage( g_hDlg, &msg ))
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
Tag | ,

10.2(화) 실습-1

from Study/API 2007/10/13 15:16 view 28290
1. 메뉴 추가( 오너드로우 )

more..


2. 모달 다이얼로그 값 읽어오기

more..


4. 메뉴적재

more..


5.  전체 화면 흉내내기

more..


6. 모달리스 ( 메시지 루프에서 다이얼로그 메시지 받기 )

more..


Tag | ,

10.1(월) 이론-2

from Study/API 2007/10/13 14:08 view 30606
1. WndProc 에서 hInstancs를 얻어내는 법

  - 전역 변수에 저장해놓고 사용하기.
  - 결국 실행파일의 주소이므로 GetModuleHandle( 0 ) 으로 얻기
  - 윈도우 Object에서 얻기. GetWindowLong( HWND, GWL_HINSTANCE )
  - WM_CREATE의 lParam에서 얻기

2. 커서 메세지
  - WM_SETCURSOR에서 모양을 바꾸자.

3. 메뉴

  - API는 HANDLE을 가지고 있다면 모두 변경 가능하다.
  - 메뉴의 HANDLE을 구할 수 있다. ( GetMenu, GetSystemMenu )
  - GetSystemMenu : FALSE는 얻어온다 HANDLE, TRUE는 초기상태로 메뉴를 되돌린다.
  - 시스템 메뉴 ID등록 : 0xF000 ->이하는 시스템메뉴 ID.
  - 메뉴 ID가 있는 하위 4비트를 0으로 하자.

4. 트래이로 숨기기
  - SC_CLOSE 가 발생했을때 트래이로 숨기면 된다.
  - TASKBAR윈도우에서는 사용자가 지정한 CALLBACKMESSAGE로 발생한 이벤트를 보내준다.
  - WM_USER+100 으로 지정했다면, wParam = Id, lParam = Message 가 들어온다.

Tag | ,

10.1(월) 이론-1

from Study/API 2007/10/13 13:49 view 27958
1. 데이타 Drag : 다른 프로세스간의 데이타를 서로 드래그 하기 __ OLE,COM 사용
  - 어렵다. -_-..차후에 공부함.

2. 파일 Drag    : 파일을 Drag해서 열기
  - WS_EX_ACCEPTFILES __ 확장 스타일로 주거나
  - shellapi.h 의 DragAcceptFiles 함수를 사용한다.

3. WM_DROPFILES
  - 윈도우창에 파일이 드래그 되었을 떄 발생한다.
  - SetCaputre, DragQueryFile, DragFinish 를 이용하여 메모리에 올라온 이름을 얻는다.

4. 리소스 원리

  - 리소스 ID를 알기 위해선 #include "resource.h" 를 해야 한다.
  - 완성된 프로그램의 PE헤더 .rsrc 에는 리소스가 있는데 이를 꺼내올 수 있다.
  - Loadxxx(모듈의주소)

5. ICON 여러가지

  - LoadIcon() 기본크기 32x32를 읽어온다. LoadImage() 로 다양한 크기를 로드 할 수 있다.
  - DrawIcon 으로 기본크기 32x32를 그린다. DrawIconEx 로 크기를 지정해서 그릴 수 있다.
 
  - SetClassLong으로 클래스 자체를 바꾼다. 이후 바뀐 클래스에 로드된 윈도우는 아이콘이 바뀐다.
  - SendMessage 현재 윈도우의 스타일만 바꾸고자 할 떄 쓰인다.




Tag | ,

10.1(월) 실습-1

from Study/API 2007/10/13 12:04 view 25594
1. 트레이에 ICON 넣기 & 시스템 메뉴에 항목추가하기

more..


2. 커서 모양 바꾸기

more..


3. DragDrop 구현( 파일이름 읽어오기 )

more..


4. spy++ UI 따라해보기( ALT+TAB 버그 수정해보기 )

more..


5. 실행시간에 ICON을 변경, 윈도우 클래스도 변경!!

more..




Tag | ,

9.21(금) 이론-1

from Study/API 2007/10/13 10:05 view 27882
1. 비트맵

  - DDB : 헤더에 6가지 정보를 갖는다. 장치에 의존하는 Bitmap
  - DIB  : BITMAPFILEINFO 구조체, 속도가 떨어진다. API함수는 DDB를 사용..

  -LoadImage : DIB->DDB로 자동 변환해준다.  DDB->DIB로 해주는건 사용자가 해야 한다.

2. Load

  - 리소스에서 LoadBitmap으로 읽어와도 되지만 이제는 LoadImage를 사용해서 꺼내온다..

3. 비트맵 -> 브러시로..

  - CreatePatternBrush 를 사용하면 브러시를 Bitmap으로 지정할 수 있다.

4. 비트맵 출력


Tag | ,

9.21(금) 실습-1

from Study/API 2007/10/10 21:46 view 23864
1. 화면 확대( CreateDC, StretchBlt )

more..


2. Cards.dll 에서 그림 꺼내오기~

more..


3. 내가 만든 Resource DLL 에서 문자열 빼오기

more..


4. 더블버퍼링의 기초( Timer를 사용하여 키보드로 사각형 움직이기 BitBlt 복사위치만 +x , +y 해주면 된다. )

more..


Tag | ,