케이피's 불량블로그!

블로그 이미지

케이피

OOP, Debugging... 인생의 숙제들..... [블로그의 글을 맹신하면 곤란]

'MFC'에 해당되는 글 41건

제목 날짜
  • 다이얼로그박스~ 2008.05.20
  • note 2008.05.20
  • note 2008.05.20
  • DrawFrameControl 2008.05.20
  • 젠장할 Viewport 2008.05.20
  • 캐럿 '_' 2008.05.20
  • MFC 매크로 2008.05.20
  • MFC 포인터 얻기~ 2008.05.20
  • - 모니터의 가로세로 해상도 구하기 2008.05.20
  • MFC 잡지식... 2008.05.20

다이얼로그박스~

잡다한 정보들(기타정보) 2008. 5. 20. 01:22

엔터 입력시 다이얼로그박스가 종료돼지 않게!!!

엔터입력시 종료되는 이유가
OnOk() 이벤트가 발생해서
CDialog::OnOk() 함수가 호출됨~
일단 다이얼로그 박스에 버튼중에 디폴트 버튼이 있는경우
이런경우가 발생안함
디폴트 버튼에 코딩된 내용에 CDialog::OnOk(); 가 있으면 종료.
 
1. OK 버튼이 있는경우
    OK버튼의 디폴트 버튼 을 해제시킨다.(스타일에서 체크해제)
    이때는 자동으로 생성된 코드에서 CDialog::OnOk(); 를 지우면 않됨

2. OK버튼이 없는경우
    // Generated message map functions
    //{{AFX_MSG(CDictionaryDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    virtual void OnOK(){}               // <--- 이부분을 추가~
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP() 
 
* 편법
1. 기본적으로 OK버튼을 만들고 OnOK() 메시지 함수를 기본적으로 생성한다..
   단 이때 위에서 언급한 내용은 쓰지 않은것으로 가정
2. 그러면 OnOk() 함수가 만들어지고 그 안에 CDialog::OnOk(); 한줄이 자동코딩되어져 있습니다.
3. 그 한줄을 지웁니다....
4. 다이알로그에서 OK 버튼을 지우고 이벤트 메시지 함수는 그대로 둡니다...
5. OnOk() 함수에 약간의 코딩을 해줍니다...무슨 내용이 들어가냐구요?
    if(GetFocus() == GetDlgItem(IDC_EDIT1))
    {
        OnInsertBtn();
    }else if(GetFocus() == GetDlgItem(IDC_EDIT2))
    {
        OnFindBtn();
    }

대충 이런내용이 들어가면 됩니다....

무슨 이야기 인즉 EDIT1 에서 엔터를 치면 인서트버튼의 메시지함수를 호출하고,

EDIT2에서 엔터를 치면 파인트버튼의 메시지함수를 호출하고...

대게 이런 연출법을 서브클래싱

* PropertySheet 의 경우~

 BOOL CDlg::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message == WM_KEYDOWN)
    {      
        if(pMsg->wParam == VK_RETURN)
        {  
              return 1;                  
        }
    }
    return CPropertySheet::PreTranslateMessage(pMsg);
}

Posted by 케이피

note

잡다한 정보들(기타정보) 2008. 5. 20. 01:21

PropertySheet 에서의 OK시 조건 확인후 다이얼로그를 닫기 위해

# PropertySheet 에서 OnApply 로 해서 검사후 OK 를 부른다.
void CPage1::OnButton1()
{
    OnOK();
    ((CPropertySheet *)GetParent())->EndDialog(IDOK);
}

OnApply() 에서 EndDialog(IDOK)를 불러서 해결~

조건 안맞으면 return false



LPSTR = long pointer string = char *
LPCSTR = long pointer constant string = const char *

LPCTSTR = long pointer constant t_string = const tchar *

LPWSTR = long pointer wide string = w_char *
LPCWSTR = long pointer constant wide string = const w_char *


#PropertySheet
 http://www.codeguru.com/Cpp/controls/propertysheet/article.php/c3973/



 

Posted by 케이피

note

잡다한 정보들(기타정보) 2008. 5. 20. 01:20

4/25
 # "The view window is a child of the frame window"

 # 상태바
SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate=TRUE);
MainFrame 포인터를 얻어 SetPaneText 때려야한다.
int idex = CommandToIndex(ID);  // 해당 페인 번호를 리턴

CMainFrame* pMfrm = (CMainFrame*)AfxGetApp()->m_pMainWnd; pDoc = (CMyAddressBookDoc*)pMfrm->GetActiveView()->GetDocument();


# 상태바 크기 조절... 은근히 쉽지 않은걸? ㅠ_ㅠ 구현 실패다...
String 길이에 따라 조절?
m_wndStatusBar.GetStatusBarCtrl().SetParts();

const int nParts = 4;
CRect rect;
m_wndStatusBarCtrl.GetClientRect(&rect);
int widths[nParts] = { rect.right-300, rect.right-200, rect.right-100, -1 };
VERIFY( m_wndStatusBarCtrl.SetParts(nParts, widths) );


# "윈도에는 어떤 자식 윈도든 삽입할 수 있다."


CListCtrl& listCtrl = GetListCtrl();
while((nItem = listCtrl.GetNextItem(nItem, LVNI_SELECTED)) != -1)

# 한줄마다 다른 색을 넣기 위해...   Custom Draw를 써야한다...
 http://www.codeproject.com/listctrl/lvcustomdraw.asp         
ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomdraw )

afx_msg void OnCustomdraw ( NMHDR* pNMHDR, LRESULT* pResult );

void CMyDlg::OnCustomdraw ( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast( pNMHDR );

    // Take the default processing unless we set this to something else below.
    *pResult = CDRF_DODEFAULT;

    // First thing - check the draw stage. If it's the control's prepaint
    // stage, then tell Windows we want messages for every item.

    if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
        {
        *pResult = CDRF_NOTIFYITEMDRAW;
        }
    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
        {
        // This is the prepaint stage for an item. Here's where we set the
        // item's text color. Our return value will tell Windows to draw the
        // item itself, but it will use the new color we set here.
        // We'll cycle the colors through red, green, and light blue.

        COLORREF crText;

        if ( (pLVCD->nmcd.dwItemSpec % 3) == 0 )
            crText = RGB(255,0,0);
        else if ( (pLVCD->nmcd.dwItemSpec % 3) == 1 )
            crText = RGB(0,255,0);
        else
            crText = RGB(128,128,255);

        // Store the color back in the NMLVCUSTOMDRAW struct.
        pLVCD->clrText = crText;

        // Tell Windows to paint the control itself.

        // pLVCD->iSubItem is column value made by zero-based
        *pResult = CDRF_DODEFAULT;
        }
}


Posted by 케이피

DrawFrameControl

잡다한 정보들(기타정보) 2008. 5. 20. 01:15

// Button
pDC->DrawFrameControl(m_oldRect, DFC_BUTTON, DFCS_BUTTONPUSH);
// CheckBox
pDC->DrawFrameControl(m_oldRect, DFC_BUTTON, DFCS_BUTTONCHECK);
// RadioButton
pDC->DrawFrameControl(m_oldRect, DFC_BUTTON, DFCS_BUTTONRADIO);
// EditBox
그냥 사각형으로?
// ComboBox
사각형 + pDC->DrawFrameControl(m_oldRect, DFC_SCROLL, DFCS_SCROLLCOMBOBOX);

버튼 위에 글쓸때 투명하게...
pDC->SetBkMode(TRANSPARENT);

DPtoLP()는 디바이스 좌표(장치 좌표)를 논리 좌표로 바꾸는거고
LPtoDP()는 논리 좌표를 디바이스 좌표로 바꾸는겁니다

CWnd에서는 디바이스 좌표를 쓰고
CDC에서는 논리 좌표를 씁니다. CDC로 뿌리고 싶으면 논리 좌표로 바꾸셔야 합니다.

Posted by 케이피

젠장할 Viewport

잡다한 정보들(기타정보) 2008. 5. 20. 01:14

*CDC::SetWindowExt()
 Remarks - device context 에 연관된 윈도우의 x, y 범위를 설정

*CDC::SetViewportExt()
 Remarks - device context의 viewport의 x, y 범위 설정

논리적인 좌료를 디바이스 좌표로 출력할때 어떻게 출력할 것인지 비율을 결정
MM_ISOTROPIC 모드로 설정시 SetWindowExt 를 SetViewportExt 부르기 전에 호출해야한다

CClientDC dc(this);
dc.SetMapMode(MM_ISOTROPIC);
dc.SetWindowExt(1000, 1000);
dc.SetViewportExt(100, 100);
// 디바이스 좌표로 100x100 으로 나타내는 것을 논리좌표 1000x1000으로 설정

CClientDC dc(this);
dc.SetMapMode(MM_ISOTROPIC);
dc.SetWindowExt(1000, 1000);
dc.SetViewportExt(100, -100);
// 부호 반대면 y좌표가 아래로 내려갈때 값이 감소

MM_ISOTROPIC : 논리 좌표계의 가로, 세로 비율이 같다
MM_ANISOTROPIC : 논리 좌표계의 가로, 세로 비율이 다르게 설정될 수 있다.
즉, MM_ISOTROPIC 에서는 원을 그리면 항상 원이지만...
MM_ANISOTROPIC 에서는 원을 그려도 타원으로 나올수 있다.

* CWnd 클래스의 멤버 함수는 모두 디바이스 좌표를 사용
* CDC 클래스의 멤버 함수는 모두 논리 좌표를 사용

Posted by 케이피

캐럿 '_'

잡다한 정보들(기타정보) 2008. 5. 20. 01:13

캐럿

CWnd는 다음과 같이 7개의 캐럿 함수를 제공한다. 그리고 제공되지는 않지만 ::DestroyCaret 함수도 반드시 필요한 함수이다.

CreateCaret - 비트맵을 이용하여 캐럿을 만든다.

CreateSolidCaret - 실선 캐럿이나 블록 캐럿을 만든다.

CreateGrayCaret - 회색 선 캐럿이나 블록 캐럿을 만든다.

GetCaretPos - 캐럿의 위치를 얻는다.

SetCaretPos - 캐럿의 위치를 설정한다.

ShowCaret - 캐럿을 표시한다.

HideCaret - 캐럿을 감춘다.


** ::DestroyCaret 생성된 캐럿을 파괴한다.


캐럿은 동일한 스레드에서 실행되는 모든 창에 의해 공유되는 스레드 단위 자원이다.


캐럿을 사용하는 규칙은 다음과 같다.


  1. 입력 포커스를 받을 때 캐럿을 만들어야 하고 입력 포커스를 잃을 때는 삭제해야 한다.


  2. 캐럿이 만들어져 있다해도 ShowCaret를 해야 표시된다. HideCaret를 하면 숨길 수 있다.

    HIdeCaret를 두번연속 했다면 ShowCaret도 두번해야 캐럿을 다시 볼 수 있다.


  3. OnPaint 외부에서 캐럿을 포함하고 있는 창 영역을 그릴 때는 캐럿을 숨겨야 한다.

    (안그러면 화면이 깨진다.)

    OnPaint 안에서 캐럿을 숨기거나 다시 표시할 필요는 없다.

    ::BeginPain와 ::EndPaint가 알아서 해준다.


  4. SetFocusPos로 캐럿을 이동시킬 수 있다.

    즉, 윈도우가 자동으로 이동시켜주지 않는다. 프로그래머가 알아서 해야 한다.



캐럿의 폭을 찾 테두리의 폭에 맞추는 경우도 있다.

SM_CXBORDER 값과 함께 ::GetSystemMetrics를 호출하면 창 테두리의 폭을 알 수 있다.


고정폭 글꼴에서는 캐럿의 폭과 높이를 글자 하나의 크기와 같도록 할 수도 있다.


캐럿이동은 CWnd::SetCaretPos로 한다.


고정폭 글꼴은 문자의 위치에 한 문자의 폭을 곱하면 새로운 문자의 위치를 알 수 있다.


가변폭 글꼴은 CDC::GetTextExtent나 CDC::GetTabbedTextExtent 함수를 이용하여 논리적 단위로 가변폭 글꼴의 문자열 폭을 계산할 수 있다.


** CWnd나 CWnd를 상속받은 창에서 캐럿을 사용하려면 대단히 귀찮은 작업들을 많이 해줘야 한다.   따라서 웬만하면 CEdit와 같은 컨트롤로 해결하도록 한다.

그러나... CEdit와 같은 클래스로 할 수 없는 다양한 에디팅처리가 꼭 필요하다면 할수 없이 캐럿을 사용해야 한다.



RichEdit에서 캐럿을 포인트 단위로 보이게 할수는 있지만 실제로 위치 시킬순 없어!!!!!
변환 시키는 과정이 필요~!~!~!

CPoint ptCaret = m_richTest.GetCaretPos(); // 카렛의 위치를 구합니다.

    int nChar;
// 카렛 위치에 해당하는 것이 몇 번째 글자인 지를 알아냅니다.
nChar = SendMessage(EM_CHARFROMPOS, 0, (LPARAM)&pt);
// 그 부분을 선택합니다. 시작과 끝이 같게 합니다.
GetRichEditCtrl().SetSel(nChar, nChar);

Posted by 케이피

MFC 매크로

잡다한 정보들(기타정보) 2008. 5. 20. 01:12

선언 매크로 : DECLARE_DYNAMIC

수행 매크로 : IMPLEMENT_DYNAMIC
- 베이스 클래스에서 파생되어 변화된 클래스로 구동된다.

선언 매크로 : DECLARE_DYNCREATE

수행 매크로 : IMPLEMENT_DYNCREATE
- CObject 클래스에서 파생되어 다양한 형태의 클래스로 만들어진다.

선언 매크로 : DECLARE_SERIAL

수행 매크로 : IMPLEMENT_SERIAL
- CObject 클래스에서 파생된 다른 킬래스와 연결될 수 있게 한다.

선언 매크로 : DECLARE_MESSAGE_MAP
수행 매크로 : BEGIN_MESSAGE_MAP END_MESSAGE_ MAP
- 메시지 팹핑을 선언하고 수행 매크로 사이에 설정된 메시지 처리를 해당 클래스에서 고동한다.

Posted by 케이피

MFC 포인터 얻기~

잡다한 정보들(기타정보) 2008. 5. 20. 01:11

CTestDoc* pDoc =
  (CTestDoc *)((CMDIFrameWnd *)AfxGetMainWnd())->GetActiveFrame()->GetActiveDocument();


1. MainFrame 포인터 얻기

CMainFrame *frame = (CMainFrame*)AfxGetMainWnd();


2. Doc 클래스 포인터 얻기
CxxxDoc *pDoc = (CxxxDoc*)(frame->GetActivedocument());


3. View 클래스 포인터 얻기
CxxxView* pView = (CxxxView*)((CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();

[SDI 형태]

1. MainFrame 얻기
- CMainFrame *pFrame = (CmainFrame *) AfxGetMainWnd();

2. App 포인터 얻기
- CTestApp *pApp = (CtestApp *) AfxGetApp();

3. Document 포인터 얻기
- CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  CTestDoc *pDoc = (CTestDoc *)pFrame->GetActiveDocument();
- CTestDoc *pDoc = ((CMainFrame *)AfxGetMainWnd())->GetActiveDocument();

4. View 포인터 얻기
- CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  CTestView *pView = (CTestView *)pFrame->GetActiveView();
- CTestView *pView = ((CMainFrame *)AfxGetMainWnd())->GetActiveView();
 

[MDI 형태]

1. ChildFrame 포인터 얻기
- CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();
- CChildFrame *pChild = ((CMainFrame *)AfxGetMainWnd())->GetActiveFrame();

2. Document 포인터 얻기
- CMainFrame *pFrame = (CMainFrame)AfxGetMainWnd();
  CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();
  CMdiTestDoc *pDoc = (CMdiTestDoc *)pChild->GetActiveDocument();
- CMdiTestDoc *pDoc = (((CMainFrame *)AfxGetMainWnd())->GetActiveFrame())->GetActiveDocument();

3. View 포인터 얻기

- CCainFrame *pFrame = (CMainFrame)AfxGetMainWnd();
  CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();
  CMdiTestView *pView = (CMdiTestDoc *)pChild->GetActiveView();
- CMdiTestView *pView = (((CMainFrame *)AfxGetMainWnd())->GetActiveFrame())->GetActiveView();


% OnNewDocument()에서 아직 View 도 생성되기전에 참조를 하면 X된닷!!!!

Posted by 케이피

- 모니터의 가로세로 해상도 구하기

잡다한 정보들(기타정보) 2008. 5. 20. 01:10
- 모니터의 가로세로 해상도 구하기
CDC *pDC=GetDC();
int nWidth=pDC->GetDeviceCaps(HORZRES);
int nHeight=pDC->GetDeviceCaps(VERTRES);
ReleaseDC(pDC);
Posted by 케이피

MFC 잡지식...

잡다한 정보들(기타정보) 2008. 5. 20. 01:10
CSplitterWnd::CreateView로
쪼갠 윈도우에 다이얼로그류의 폼뷰를 넣을땐
Stype을 Child로 해야됀다!!!  (Popup으로 하면 낭패... ㅠ_ㅠ)
Posted by 케이피
이전페이지 다음페이지
블로그 이미지

OOP, Debugging... 인생의 숙제들..... [블로그의 글을 맹신하면 곤란]

by 케이피

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

  • 객체지향
  • OOP
  • 엠마스톤
  • Mentor
  • 최적화?
  • SmartClient
  • CView
  • Emma Stone
  • MFC
  • Automation
  • trace
  • CString
  • XML
  • CNN
  • c#
  • vs2008
  • activex
  • DLL
  • 최강 볼걸
  • debugging
  • JAVA 맛보기
  • IME
  • LPCSTR
  • 안드로이드
  • dbgView
  • bug
  • MFC Tip
  • 유로2008 일정
  • excel
  • 8강전

글 보관함

«   2025/08   »
일 월 화 수 목 금 토
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

링크

카테고리

전체보기 (98)
Qt의 오묘함 (1)
영양가없는이야기(개인사) (1)
주체못할파괴본능(디버그) (5)
넌왜C++을C처럼쓰냐?(OOP) (2)
잡다한 정보들(기타정보) (53)
귀찮아...(유용링크) (13)
참 잼난다(취미) (6)
JAVA 의 향기~(자바) (2)
코딩을부탁해(Rapid Coding) (0)
베스트똘추짓(개고생리스트) (11)
매운핫소스(허접소스) (1)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
케이피's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

케이피's 불량블로그!

OOP, Debugging... 인생의 숙제들..... [블로그의 글을 맹신하면 곤란]

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 전체보기 (98)
    • Qt의 오묘함 (1)
    • 영양가없는이야기(개인사) (1)
    • 주체못할파괴본능(디버그) (5)
    • 넌왜C++을C처럼쓰냐?(OOP) (2)
    • 잡다한 정보들(기타정보) (53)
    • 귀찮아...(유용링크) (13)
    • 참 잼난다(취미) (6)
    • JAVA 의 향기~(자바) (2)
    • 코딩을부탁해(Rapid Coding) (0)
    • 베스트똘추짓(개고생리스트) (11)
    • 매운핫소스(허접소스) (1)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바