'MFC'에 해당되는 글 10건

  1. 2007.08.29 스트링 리소스를 이용한 툴바 자동 텍스트 삽입 및 크기 교정 코드
  2. 2007.08.27 메뉴(Menu)의 Owner Draw 기법 (3)
  3. 2007.08.27 CBitmap::LoadOEMBitmap 사용시 주의사항 (2)
  4. 2007.06.28 ScrollBar (1)
  5. 2007.06.28 원점 이동
  6. 2007.06.27 Unicode
  7. 2007.06.27 Message Map
  8. 2007.06.27 MFC 기본 프로그램 구조
  9. 2007.06.27 Afx 함수 모음
  10. 2007.06.27 [MFC] 정리 안내
2007.08.29 16:18

스트링 리소스를 이용한 툴바 자동 텍스트 삽입 및 크기 교정 코드

툴바의 ID와 동일한 스트링 리소스를 이용하여 툴바에 자동으로 텍스트를 삽입하고
가장 긴 텍스트의 크기를 기준으로 모든 툴바 버튼의 크기를 자동으로 동일하게 교정한다.

 int nSepCount = 0;
 TBBUTTON tb;
 TCHAR name[1024];
 UINT nID;
 for(int i = 0; i < m_wndToolBar.GetCount(); ++i)
 {
  ZeroMemory(&tb, sizeof(tb));
  m_wndToolBar.GetToolBarCtrl().GetButton(i, &tb);

  if(tb.fsStyle & TBSTYLE_SEP)
  {
   ++nSepCount;
   continue;
  }

  if(tb.idCommand == 0)
   continue;

  nID = m_wndToolBar.GetItemID(i);
  ZeroMemory(name, sizeof(name) / sizeof(TCHAR));
  ::LoadString(AfxGetInstanceHandle(), nID, name, sizeof(name) / sizeof(TCHAR));

  TCHAR* lineIndex = _tcsstr(name, _T("\n"));
  if(lineIndex)
   m_wndToolBar.SetButtonText(i, lineIndex + 1);
 }

 CRect rc(0, 0, 0, 0);
 CSize sizeMax(0, 0);
 for(int i = 0; i < m_wndToolBar.GetCount(); ++i)
 {
  m_wndToolBar.GetItemRect(i, &rc);
  rc.NormalizeRect();
  sizeMax.cx = max(rc.Size().cx, sizeMax.cx);
  sizeMax.cy = max(rc.Size().cy, sizeMax.cy);
 }

 CBitmap bitmap;
 BITMAP bm;
 bitmap.LoadBitmap(IDR_MAINFRAME);
 bitmap.GetBitmap(&bm);
 m_wndToolBar.SetSizes(sizeMax,
  CSize(bm.bmWidth / (m_wndToolBar.GetCount() - nSepCount), bm.bmHeight));



주의: 코드 최적화 필요 (TBBUTTON에서 이미 필요한 정보를 모두 얻었음.)
귀찮아서 나중에 --;

신고
Trackback 96 Comment 0
2007.08.27 16:12

메뉴(Menu)의 Owner Draw 기법

Example Colors at Chap. 4 (Programming Windows with MFC 2nd/Jeff Prosise)

void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 BITMAP bm;
 CBitmap bitmap;
 bitmap.LoadOEMBitmap(OBM_CHECK);
 bitmap.GetObject(sizeof(bm), &bm);

 CDC dc;
 dc.Attach(lpDrawItemStruct->hDC);

 CBrush* pBrush = new CBrush(
  ::GetSysColor(
  (lpDrawItemStruct->itemState & ODS_SELECTED) ? COLOR_HIGHLIGHT : COLOR_MENU));
 dc.FrameRect(&(lpDrawItemStruct->rcItem), pBrush);
 delete pBrush;

 if(lpDrawItemStruct->itemState & ODS_CHECKED)
 {
  CDC dcMem;
  dcMem.CreateCompatibleDC(&dc);
  CBitmap* pOldBitmap = dcMem.SelectObject(&bitmap);
  dc.BitBlt(
   lpDrawItemStruct->rcItem.left + 4,
   lpDrawItemStruct->rcItem.top +
    (((lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top) -
    bm.bmHeight) / 2),
   bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY);

  dcMem.SelectObject(pOldBitmap);
 }

 UINT itemID = lpDrawItemStruct->itemID & 0xFFFF;
 pBrush = new CBrush(((CColorsView*)GetActiveView())->m_clrColors[itemID - ID_COLOR_RED]);
 CRect rect = lpDrawItemStruct->rcItem;
 rect.DeflateRect(6, 4);
 rect.left += bm.bmWidth;
 dc.FillRect(rect, pBrush);
 delete pBrush;

 dc.Detach();
}

void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
 lpMeasureItemStruct->itemWidth = ::GetSystemMetrics(SM_CYMENU) * 4;
 lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU);
}

신고
Trackback 0 Comment 3
  1. Jordan 4 2012.02.17 16:53 신고 address edit & del reply

    나이 키 AIR JORDAN 흥행 을 잘 팔 리 는, 4 Shoes 고품질, 일로 돼 씻 어도 된 다.

  2. Jordan 4 Mars 2012 2012.07.31 11:41 신고 address edit & del reply

    어떤 종종 조던 신발 그러므로 인기했고, 통계 나이키 신발 매출은 완전히 판매 최첨단 역사와 디지털 조던 신발에 관한. 나이키 숙련된 디자인 르브론 신발은 제임스를하기 전에 가장 유익한 예제, 르브론 존 마지막까지 당신을 위해 지난 시즌에 헤드 마이애미 히트이고, 상대는 끊임없이 에어 조단 대부분 계절에 착용. http://www.jordanmars4forsale.com

  3. Jordan 4 Fire Red 2012.07.31 11:45 신고 address edit & del reply

    젊은이를위한 모델로서 요르단 요르단의 이야기는 또한 학생들이 가까운 장래에 자신의 꿈을 개발하는 것이 좋습니다! 짧은, 혼자가 아니야 요르단 신발 판매 노하우뿐만 아니라 수익 스포츠 정신.
    http://www.jordan4retrofirered2012.com

2007.08.27 15:57

CBitmap::LoadOEMBitmap 사용시 주의사항

CBitmap::LoadOEMBitmap 사용시 첫번째 인자인 nIDBitmap의 값으로써 OBM_ 계열의 상수를 사용하기 위해서는

#define OEMRESOURCE가 windows.h가 include되기 전에 선언되어야 한다.



[stdafx.h]ファイル
// ...
#define OEMRESOURCE
#include <afxwin.h>
// ...

[main.cpp]ファイル
#include "stdafx.h"
// ...
CBitmap bitmap;
bitmap.LoadOEMBitmap ( OBM_CHECK );// チェックを示したビットマップを読み込む
// ...


다음은 MSDN원문

Parameters

nIDBitmap

ID number of the predefined Windows bitmap. The possible values are listed below from WINDOWS.H:

OBM_BTNCORNERS

OBM_OLD_RESTORE

OBM_BTSIZE

OBM_OLD_RGARROW

OBM_CHECK

OBM_OLD_UPARROW

OBM_CHECKBOXES

OBM_OLD_ZOOM

OBM_CLOSE

OBM_REDUCE

OBM_COMBO

OBM_REDUCED

OBM_DNARROW

OBM_RESTORE

OBM_DNARROWD

OBM_RESTORED

OBM_DNARROWI

OBM_RGARROW

OBM_LFARROW

OBM_RGARROWD

OBM_LFARROWD

OBM_RGARROWI

OBM_LFARROWI

OBM_SIZE

OBM_MNARROW

OBM_UPARROW

OBM_OLD_CLOSE

OBM_UPARROWD

OBM_OLD_DNARROW

OBM_UPARROW

OBM_OLD_LFARROW

OBM_ZOOM

OBM_OLD_REDUCE

OBM_ZOOMD


Bitmap names that begin with OBM_OLD represent bitmaps used by Windows versions prior to 3.0.

Note that the constant OEMRESOURCE must be defined before including WINDOWS.H in order to use any of the OBM_ constants.

신고
Trackback 64 Comment 2
  1. Tom Brady Jersey 2012.07.07 11:09 신고 address edit & del reply

    5일(현지시간) 영국 텔레그래프에 따르면 나치 친위대장으로 강제수용소를 감독했던 하인리히 힘러는 1941년 8월27일 뒤셀도르프 게슈타포(나치 비밀경찰) 앞으로 한 통의 편지를 보냈다. 편지에는 '총통(히틀러)의 바람에 따라' 유대인 에른스트 헤스의 '구제와 보호'를 승인한다는 내용이 담겨 있었다. 앞서 히틀러는 헤스가 '박해 받거나 강제추방되지 않도록' 하라고 하달했고 힘러는 모든 관계 당국과 관리에게 헤스가 '어떤 식으로든 불편을 겪지 않도록 해라'고 지시를 내렸다. http://www.nikepatriotsjerseyonline.com/

  2. Lebron 9 South Beach 2012.08.07 11:25 신고 address edit & del reply

    신발은 검정색, 빨간색으로 악센트 데로 이루어집니다. 실제 swoosh은 흰색으로 장식되어있다. 단순히, 그것은, 내부 규율하지만 용감한 스타일 말하기. 짠 패널을 사용할 때 위쪽으로 많이 이용 Flywire을 결합하며 Hyperfuse 기술은 함께 놀라운 것입니다. 실제 감동이 너무 멋져요. http://www.2012lebron9shoes.com

2007.06.28 22:53

ScrollBar

 
  1. 스크롤바 추가하기
  2. 윈도우의 스타일에 WS_VSCROLL이나 WS_HSCROLL 추가한다.

    Create(NULL, _T(""), WS_OVERLAPPEDWINDOW | WS_VSCROLL);


  3. 기본스타일(dwStyle)
  4. WS_VSCROLL

    수직 스크롤바

    WS_HSCROLL

    수평 스크롤바


  5. 확장스타일(dwExStyle)
  6. WS_EX_LEFTSCROLLBAR

    왼쪽 스크롤바


  7. 기본 함수 (구형)
  8. SetScrollRange(int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = 1)

    스크롤바의 범위를 지정한다

    SetScrollPos(int nBar, int nPos, BOOL bRedraw = 1)

    스크롤바의 현재 위치를 지정한다.

    GetScrollRange

    GetScrollPos


    nBar Styles

    SB_VERT

    수직 스크롤바

    SB_HORZ

    수평 스크롤바


    SetScrollRange, SetScrollPos 연속으로 호출되면 스크롤바가 자신을 다시 그리지 않게 한다.

    SetScrollRange(SB_VERT, 0, 100, FALSE);

    SetScrollPos(SB_VERT, 50, TRUE);


  9. SetScrollInfo
  10. 현재는 SetScrollRange, SetScrollPos 쓰지 않는다.


    int SetScrollInfo(      

        HWND hwnd,
        int fnBar,
        LPCSCROLLINFO lpsi,
        BOOL fRedraw
    );


    fnBar

    [in] Specifies the type of scroll bar for which to set parameters. This parameter can be one of the following values.

    SB_CTL

    Sets the parameters of a scroll bar control. The hwnd parameter must be the handle to the scroll bar control.

    SB_HORZ

    Sets the parameters of the window's standard horizontal scroll bar.

    SB_VERT

    Sets the parameters of the window's standard vertical scroll bar.


    typedef struct tagSCROLLINFO {
        UINT cbSize;
        UINT fMask;
        int  nMin;
        int  nMax;
        UINT nPage;
        int  nPos;
        int  nTrackPos;
    }   SCROLLINFO, *LPSCROLLINFO;
    typedef SCROLLINFO CONST *LPCSCROLLINFO;


    cbSize

    Specifies the size, in bytes, of this structure. The caller must set this to sizeof(SCROLLINFO).

    fMask

    Specifies the scroll bar parameters to set or retrieve. This member can be a combination of the following values:

    SIF_ALL

    Combination of SIF_PAGE, SIF_POS, SIF_RANGE, and SIF_TRACKPOS.

    SIF_DISABLENOSCROLL

    This value is used only when setting a scroll bar's parameters. If the scroll bar's new parameters make the scroll bar unnecessary, disable the scroll bar instead of removing it.

    SIF_PAGE

    The nPage member contains the page size for a proportional scroll bar.

    SIF_POS

    The nPos member contains the scroll box position, which is not updated while the user drags the scroll box.

    SIF_RANGE

    The nMin and nMax members contain the minimum and maximum values for the scrolling range.

    SIF_TRACKPOS

    The nTrackPos member contains the current position of the scroll box while the user is dragging it.

    nMin

    Specifies the minimum scrolling position.

    nMax

    Specifies the maximum scrolling position.

    nPage

    Specifies the page size. A scroll bar uses this value to determine the appropriate size of the proportional scroll box.

    nPos

    Specifies the position of the scroll box.

    nTrackPos

    Specifies the immediate position of a scroll box that the user is dragging. An application can retrieve this value while processing the SB_THUMBTRACK request code. An application cannot set the immediate scroll position; the SetScrollInfo function ignores this member.


  11. 범위의 상한값(nMax) 하안값(nMin) 같게 하면 스크롤바는 사라진다.
  12. SCROLLINFO fMask SIF_DISABLENOSCROLL을 입력하면 스크롤바가 더 이상 입력을 받지 못한다.

  13. WM_SIZE Message
    • 최초 메시지: 창이 생성될
    • 이후 메시지: 창의 크기가 바뀔

    afx_msg void OnSize(UINT nType, int cx, int cy);


    nType: SIZE_MINIMIZED, SIZE_MAXIMIZED, SIZE_RESTORED

    cx, cy: 클라이언트의 새로운 폭과 넓이(픽셀)


  14. Scroll Event
  15. afx_msg void OnHScroll(UINT nCode, UINT nPos, CScrollBar* pScrollBar)

    afx_msg void OnHScroll(UINT nCode, UINT nPos, CScrollBar* pScrollBar)


    CWnd::Create 스타일 플래그를 추가하여 생성되었던 스크롤바는 pScrollBar NULL이다.


    nCode Event Code

    SB_LINEUP (SB_LINELEFT)

    화살표

    SB_LINEDOWN (SB_LINERIGHT)

    아래 화살표

    SB_PAGEUP (SB_PAGELEFT)

    화살표와 이동 막대 사이 스크롤바 클릭

    SB_PAGEDOWN (SB_PAGERIGHT)

    아래 화살표와 이동 막대 사이 스크롤바 클릭

    SB_ENDSCROLL

    마우스 버튼이 떼어졌을

    SB_THUMBTRACK

    이동 단추가 이동될

    SB_THUMBPOSITION

    이동 버튼이 놓일


  16. 스크롤바는 스스로 스크롤바 위치를 갱신하지 않는다. (직접 갱신)

  17. 내용 갱신
  18. CWnd::ScrollWindow 빠른 블록 픽셀 전송을 사용하여 창의 클라이언트 영역의 내용 전체 도는 일부를 상하 좌우로 1또는 이상의 픽셀만큼 이동한다.


    BOOL ScrollWindow(      

        HWND hWnd,
        int XAmount,
        int YAmount,
        const RECT *lpRect,
        const RECT *lpClipRect
    );


    The area uncovered by ScrollWindow is not repainted, but it is combined into the window's update region. The application eventually receives a WM_PAINT message notifying it that the region must be repainted. To repaint the uncovered area at the same time the scrolling is in action, call the UpdateWindow function immediately after calling ScrollWindow.

신고
Trackback 0 Comment 1
  1. Jordan 4 2012.02.17 16:54 신고 address edit & del reply

    나이 키 AIR JORDAN 흥행 을 잘 팔 리 는, 4 Shoes 고품질, 일로 돼 씻 어도 된 다.

2007.06.28 22:52

원점 이동

 
  1. SetViewportOrg

    논리 좌표 (0, 0) -> 장치 좌표 (x, y)

  2. SetWindowOrg

    논리 좌표 (x, y) -> 장치 좌표 (0, 0)

    만약 좌표(0, 0)에서 픽셀을 그리려고 하면 좌표쌍은 GDI 의해서 (-x, -y) 변환된다.

    ScrollBar 결합될 경우 스크롤 위치가 (0, 100) 경우 처음 100픽셀은 출력에서 잘려지고 실제 출력은 101번째 픽셀부터 화면에 출력된다.

신고
Trackback 74 Comment 0
2007.06.27 19:24

Unicode

 
  1. ANSI characters
    • "Hello"
  2. Unicode characters
    • L"Hello"
  3. Generic Macro
    • _T("Hello")

    _T("") 매크로 포장 해야

  4. 문자를 char 아닌 TCHAR 선언
  5. TCHAR 문자열의 포인터를 선언할 TCHAR*, LPTSTR, LPCTSTR 사용
  6. 문자열의 크기는 16비트, 버퍼의 길이를 sizeof(TCHAR) 나누어 실제 길이 산출
  7. C 런타임 라이브러리의 문자열 함수를 적절하게 바꿔준다. Strcpy -> _tcscpy
신고
Trackback 0 Comment 0
2007.06.27 19:24

Message Map

 

    이제는 외우자!


    받을 있는 모든 메시지에 대한 가상 함수가 모든 클래스에 존재하는 경우에 요구되는 VTABLE 피하기 위하여 CCmdTarget에서 파생된 모든 클래스에는 메시지 맵이 포함되어 있다.


  1. 클래스 정의에 DECLARE_MESSAGE_MAP(target class, base class) 구문 추가하여 메시지 선언
  2. BEGIN_MESSAGE_MAP END_MESSAGE_MAP사이에 해당 클래스가 처리해야 메시지를 식별하는 매크로를 삽입한다.
  3. 멤버 함수를 재정의하여 추가작업을 처리한다.

    Afxmsg_.h 참조



  4. DECLARE_MESSAGE_MAP Macro

    P61




신고
Trackback 53 Comment 0
2007.06.27 19:23

MFC 기본 프로그램 구조

 

적어도 이정도는 기억해두자 (맨날 까먹어…)


class CMyApp : public CWinApp

{

public:

virtual BOOL InitInstance();

};


class CMainWindow : public CFrameWnd

{

public:

CMainWindow();


protected:

afx_msg void OnPaint();

DECLARE_MESSAGE_MAP()

};


#include <afxwin.h>

#include "Hello.h"


CMyApp myApp;


BOOL CMyApp::InitInstance()

{

m_pMainWnd = new CMainWindow;


m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();


return TRUE;

}


BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)

ON_WM_PAINT()

END_MESSAGE_MAP()


CMainWindow::CMainWindow()

{

Create(NULL, _T("The Hello Application"));

}


void CMainWindow::OnPaint()

{

CPaintDC dc(this);

CRect rect;

GetClientRect(&rect);


dc.DrawText(_T("HELLO MFC"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

}


신고
Trackback 107 Comment 0
2007.06.27 19:22

Afx 함수 모음

 

내용이 없는 것은 충분히 함수이름만으로도 파악 가능


AfxAbort

응용프로그램 종료, 복구할 없는 오류 발생의 경우

AfxBeginThread


AfxEndThread


AfxMessageBox


AfxGetApp


AfxGetAppName


AfxGetMainWnd


AfxGetInstahceHandle


AfxRegisterWndClass

MFC응용 프로그램에 대한 사용자 정의 WNDCLASS 등록한다.

신고
Trackback 29 Comment 0
2007.06.27 19:20

[MFC] 정리 안내

여기에 올리는 것은 그냥 외울 것.

신고
Trackback 141 Comment 0


티스토리 툴바