Programming/C Win32 MFC2017. 10. 26. 15:06

시리얼 모니터 만들었는데.. 입력 받을때 마다 메모리가 쭉쭉 늘어난다 ㅠㅠ

내용을 empty string으로 해도.. 삭제하고 undo 버퍼를 비워도 안되는데

멀 해야지.. 할당했던 메모리를 다시 뱉을까?


메모리 사용량 늘어남 -_-

m_eterm0.SetSel(0, -1);

m_eterm0.Clear();

m_eterm0.EmptyUndoBuffer();


메모리 사용량 변함없음(줄지 않음)


m_eterm0.SetWindowTextW(_T("")); 



[링크 : https://msdn.microsoft.com/ko-kr/library/f7yhsd2b.aspx]

'Programming > C Win32 MFC' 카테고리의 다른 글

mfc sleep 주의  (0) 2017.11.08
win32 usb class  (0) 2017.11.03
CEdit 길이 제한  (0) 2017.10.26
MFC USB 시리얼 제거 탐지하기 OnDeviceChange()  (0) 2017.10.25
MFC 다이얼로그에 웹브라우저 넣기  (0) 2017.10.24
Posted by 구차니
Programming/C Win32 MFC2017. 10. 26. 14:44

당연(?) 하겠지만 CEdit에 넣을수 있는 글씨는 제한이 있다.

풀어는 줄 수 있는데.. 적당히 풀어야 메모리 적당히 먹겠...지?


[링크 : http://blog.naver.com/joon2457/220628611105]


CEdit::SetLimitText

void SetLimitText( UINT nMax );

Parameters

nMax

The new text limit, in bytes. 

[링크 : https://msdn.microsoft.com/en-us/library/aa279321(v=vs.60).aspx]


CEdit::LimitText

void LimitText( int nChars = 0 );

Parameters

nChars

Specifies the length (in bytes) of the text that the user can enter. If this parameter is 0, the text length is set to UINT_MAX bytes. This is the default behavior. 

[링크 : https://msdn.microsoft.com/en-us/library/aa279307(v=vs.60).aspx]

Posted by 구차니
Programming/C Win32 MFC2017. 10. 25. 16:36

대부분의 툴들이..

USB 시리얼 뽑으면 먹통이 되는 경우가 많은데

그거 해결용으로 검색중..


[링크 : https://stackoverflow.com/.../identify-disconnect-event-with-a-windows-usb-virtual-com-port]


FTDI의 경우에는 이렇게 보내는 주는 듯?

class CAboutDlg : public CDialog

{

void CD2XXNotifyDlg::OnPaint();

BOOL CD2XXNotifyDlg::OnDeviceChange(UINT EventType, DWORD dwData);

protected:

DECLARE_MESSAGE_MAP()

};

void CAboutDlg::DoDataExchange(CDataExchange* pDX){}

BEGIN_MESSAGE_MAP(CD2XXNotifyDlg, CDialog)

ON_WM_PAINT()

ON_WM_DEVICECHANGE()

END_MESSAGE_MAP()

void CD2XXNotifyDlg::OnPaint()

{}

BOOL CD2XXNotifyDlg::OnDeviceChange(UINT EventType, DWORD dwData) {}

[링크 : http://www.ftdichip.com/.../AN_152_Detecting_USB_%20Device_Insertion_and_Removal.pdf]



MFC 클래스 위저드에는 WM_DEVICECHANGE가 없는데 afxmsg.h 에는 존재한다.

#define ON_WM_DEVICECHANGE() \

{ WM_DEVICECHANGE, 0, 0, 0, AfxSig_bwl, \

(AFX_PMSG)(AFX_PMSGW) \

(static_cast< BOOL (AFX_MSG_CALL CWnd::*)(UINT, DWORD_PTR) > ( &ThisClass :: OnDeviceChange)) }, 


    case WM_DEVICECHANGE:
    {
        //
        // This is the actual message from the interface via Windows messaging.
        // This code includes some additional decoding for this particular device type
        // and some common validation checks.
        //
        // Note that not all devices utilize these optional parameters in the same
        // way. Refer to the extended information for your particular device type 
        // specified by your GUID.
        //
        PDEV_BROADCAST_DEVICEINTERFACE b = (PDEV_BROADCAST_DEVICEINTERFACE) lParam;
        TCHAR strBuff[256];

        // Output some messages to the window.
        switch (wParam)
        {
        case DBT_DEVICEARRIVAL:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVICEARRIVAL\n"), msgCount);
            break;
        case DBT_DEVICEREMOVECOMPLETE:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVICEREMOVECOMPLETE\n"), msgCount);
            break;
        case DBT_DEVNODES_CHANGED:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVNODES_CHANGED\n"), msgCount);
            break;
        default:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: WM_DEVICECHANGE message received, value %d unhandled.\n"), 
                msgCount, wParam);
            break;
        }
        OutputMessage(hEditWnd, wParam, (LPARAM)strBuff); 

} 

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa363432(v=vs.85).aspx]


뽑으면 0x0007->0x8004 순서로 발생하고

꼽으면 0x0007->0x0007->0x8000->0x0007 으로 발생한다.

(근데 뽑는건 꼽는거에 비해서 반응이 많이 느리거나 안될때도 있음)

DBT_DEVNODES_CHANGED 0x0007

DBT_DEVICEARRIVAL 0x8000

DBT_DEVICEREMOVECOMPLETE 0x8004 

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa363480(v=vs.85).aspx]


+

여긴 일단 .net 쪽

[링크 : https://stackoverflow.com/.../usb-serial-port-unplugged-but-still-in-the-list-of-ports]

[링크 : https://stackoverflow.com/.../com-port-disappears-when-unplugging-usb]

'Programming > C Win32 MFC' 카테고리의 다른 글

CEdit 내용 지우기와 메모리 사용량  (0) 2017.10.26
CEdit 길이 제한  (0) 2017.10.26
MFC 다이얼로그에 웹브라우저 넣기  (0) 2017.10.24
한글 코드 페이지  (0) 2017.10.23
CSliderCtrl OnHScroll() 주의사항  (0) 2017.10.20
Posted by 구차니
Programming/C Win32 MFC2017. 10. 24. 16:32

원래 원하는건.. 워드처럼

각종 서식을 넣는 디버그 창인데.. 혹시나 해서 일단 검색을 해둠..


[링크 : http://shaeod.tistory.com/537]

[링크 : http://purelab.net/zbxe/guruin/108736]

'Programming > C Win32 MFC' 카테고리의 다른 글

CEdit 길이 제한  (0) 2017.10.26
MFC USB 시리얼 제거 탐지하기 OnDeviceChange()  (0) 2017.10.25
한글 코드 페이지  (0) 2017.10.23
CSliderCtrl OnHScroll() 주의사항  (0) 2017.10.20
MFC 슬라이더 사용시 주의사항  (0) 2017.10.19
Posted by 구차니
Programming/C Win32 MFC2017. 10. 23. 15:46

한국어 코드 페이지를 대상으로 하는 랜섬웨어 라는데

CP949 / CP437로  코드 페이지 기억을 했는데

웬 뜬금없는 1042 / 0x412 인가 했더니


LANGID와 ASCII codepage 라는게 따로 있었나 보네..


[링크 : http://v.media.daum.net/v/20171023093516376]

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa369771(v=vs.85).aspx]



LANGID GetSystemDefaultUILanguage(void); 

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/dd318123(v=vs.85).aspx]


Language Identifiers

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/dd318691(v=vs.85).aspx]


LANGID SetThreadUILanguage(

  _In_ LANGID LangId

); 

[링크 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd374053(v=vs.85).aspx]


Posted by 구차니
Programming/C Win32 MFC2017. 10. 20. 15:52

WM_HSCROLL은 스크롤바에서 생성되는 이벤트를 처리하는데

슬라이더바에서 생성된 이벤트 역시 이쪽으로 전송이 된다.

void CtestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 


nSBCode는 마우스의 이동방향이나 이동이 완료된 시점의 값이라던가 이런게 넘어 오는데

SB_THUMBTRACK은 마우스를 누른채 이동시(WM_MOUSEMOVE 이벤트 발생시)

SB_THUMBPOSITION은 마우스를 뗄 때 (WM_LBUTTONUP 발생시, 마지막 이동 위치)

SB_ENDSCROLL은 마우스를 뗄 때(WM_LBUTTONUP, nPos 값이 0으로 옴) 발생을 한다.


#define SB_THUMBTRACK       5

#define SB_THUMBPOSITION    4

#define SB_ENDSCROLL        8


SB_THUMBTRACK   Drag scroll box to specified position. The current position is specified by the nPos parameter.

SB_THUMBPOSITION   Scroll to absolute position. The current position is specified by the nPos parameter.

SB_ENDSCROLL   End scroll.

[링크 : https://msdn.microsoft.com/en-us/library/aa249894(v=vs.60).aspx]

[링크 : http://www.tipssoft.com/bulletin/tb.php/FAQ/419]


다만, SB_THUMBPOSITION와 SB_THUMBTRACK 외에는 nPos를 통해서 위치 값이 날아 오지 않으며

슬라이더를 클릭해서 이동시에는 SB_PAGEUP/SB_PAGEDOWN + SB_ENDSCROLL만 발생하므로

별도의 루틴을 통해 위치값을 받아와야 한다.


드래그와 클릭시 스크롤바 이동할때

이 경우에 대해서 제외하면 중복되게 오진 않는 것으로 파악된다.

if(nSBCode == SB_THUMBPOSITION || nSBCode == SB_ENDSCROLL) return; 


Posted by 구차니
Programming/C Win32 MFC2017. 10. 19. 15:06

MFC에서 슬라이더 컨트롤을 더블클릭하면

조금은 심하게 생뚱맞은 핸들러가 생성되는데 문제는.. 값이 변하는데 나오는 값이 아닌

슬라이더를 그리는데 필요한 핸들러가 호출되도록 연결된다.. -_-

ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, &CtestDlg::OnNMCustomdrawSlider1) 


void CtestDlg::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)

{

// optical zoom slider

LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

*pResult = 0;


아무튼.. 여기다가 억지로 코드를 구겨 넣어서 값을 넣어두니..

실행하면 창이 뜨기도 전에 에러가 발생하는 사태가 발생..


클래스 위저드에서 "메시지 - WM_HSCROLL" 을 택해서 추가한 후

원하는 슬라이더 컨트롤의 스크롤바인지 확인하고 처리를 해주어야 한다.

void CtestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.


CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);


[링크 : http://system.tistory.com/entry/MFC슬라이더-컨트롤-사용법]


void CMyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 

{

    CSliderCtrl *ACSliderCtrl = (CSliderCtrl *)pScrollBar;

    int nID = ACSliderCtrl->GetDlgCtrlID();

    int NewPos = ((CSliderCtrl *)pScrollBar)->GetPos();

    CWnd *ACWnd = GetDlgItem(nID);



    switch (nID)

    {

        default:

            break;


        case IDC_SLIDER1:

            m_edit1.Format( "%d", NewPos );

            UpdateData(FALSE);

            break;

    }

    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

[링크 : https://stackoverflow.com/questions/7269834/event-when-a-particular-slider-is-changed]

[링크 : https://msdn.microsoft.com/ko-kr/library/xzkasz2y(v=vs.100).aspx]

'Programming > C Win32 MFC' 카테고리의 다른 글

한글 코드 페이지  (0) 2017.10.23
CSliderCtrl OnHScroll() 주의사항  (0) 2017.10.20
MFC CMenu  (0) 2017.10.16
MFC 다이얼로그 창 크기 변경 못하도록 하기  (2) 2017.10.11
MFC 버튼에 아이콘 표시 관련  (0) 2017.10.11
Posted by 구차니
Programming/C Win32 MFC2017. 10. 16. 17:40

MFC CMenu에서 선택/선택해제 하도록 하는 방법


음.. radio 처럼 하나 선택하면 다른거 풀리는게 아니다 보니

여러개 항목이라면 꽤나 번거로워 질 듯 하다 ㅠㅠ


[링크 : http://cysnim12.tistory.com/entry/메뉴-항목-체크-해지-하기]


DWORD WINAPI CheckMenuItem(

  _In_ HMENU hmenu,

  _In_ UINT  uIDCheckItem,

  _In_ UINT  uCheck

);

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/ms647619(v=vs.85).aspx]


UINT GetMenuState(

   UINT nID,

   UINT nFlags 

) const;

[링크 : ]https://msdn.microsoft.com/ko-kr/library/5z8dxz39.aspx

Posted by 구차니
Programming/C Win32 MFC2017. 10. 11. 14:10

스타일이랑은 좀 다른건가..?

아무튼 스택오버플로우 문서에서 힌트를 얻어 보다 보니..

Border가 THICK 이면 resize가 된다고 하니

Thick이 아닌 걸로 찾아보니..

Thin / Resizing / Dialog Frame / None 중에 일단

Thin으로 하니 리사이즈가 안된다!!



[링크 : https://stackoverflow.com/questions/3275989/disable-window-resizing-win32]

'Programming > C Win32 MFC' 카테고리의 다른 글

MFC 슬라이더 사용시 주의사항  (0) 2017.10.19
MFC CMenu  (0) 2017.10.16
MFC 버튼에 아이콘 표시 관련  (0) 2017.10.11
MFC 버튼에 이미지 넣기  (0) 2017.10.10
MFC CMenu 폰트 변경하기  (0) 2017.10.08
Posted by 구차니
Programming/C Win32 MFC2017. 10. 11. 12:57

일단 BMP를 ICO로 웹에서 변경하고 다운 받은 후

리소스에 추가하고 그걸 불러 오는 쪽으로 전환을 했는데..

속성에 보면 Bitmap과 Icon이 있는데 둘다 체크해도 상관없고

둘중에 하나라도 체크를 해주어야 아이콘이 표시된다.


왼쪽은 icon/bitmap true로 설정

오른쪽은 둘다 false로 설정했을때 표시되는 내용


다만, 둘다 false로 표시해도

충분히 크면 표시는 되는데 예상한 것과는 좀 다르게 작동하는 것 같아서

아이콘 크기라던가 이런거 좀 고민중..

버튼을 줄이면 이런식으로 나오는데.. 

버튼의 중심점을 기준으로 왼쪽에 표시하고 크기에 따라 잘리게 되는것 같은 느낌?


BM_SETIMAGE is not a button style, but a message which is sent to the window in order to set a bitmap. What you probably want is the BS_BITMAP style. Unfortunately as far as I know, it is not possible to have both text and a bitmap on a standard button. But you should find plenty of working implementations of a custom button class on sites like codeguru or codeproject. 

[링크 : https://stackoverflow.com/.../how-to-show-both-icon-and-text-on-button-on-mfc]

[링크 : https://www.codeproject.com/.../HowpluscanplusIpluscreateplusplusbuttonplusshowing]


이상하다.. 왜 두배 정도 커졌지?


+

SetIcon 대신에 LoadImage를 해서 HICON 핸들을 얻은후 그걸로 넣으면 해결

간단한 방법 없나...

[링크 : http://forums.codeguru.com/showthread.php?394090-Resizing-icon-on-a-button]

[링크 : https://www.experts-exchange.com/.../MFC-SetIcon-problem-if-called-twice.html]

[링크 : https://www.experts-exchange.com/.../CMFCButton-Icon-twice-as-big-as-it-should-be.html]


+

void CtestDlg::setIconBydlgitem(int dlg, int icon)

{

CButton *btn;

btn = ((CButton*)GetDlgItem(dlg));

HICON DSN_ICON = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(icon), IMAGE_ICON, 16, 16, 0);

btn->SetIcon(DSN_ICON);


+

HICON SetIcon(

   HICON hIcon,

   BOOL bBigIcon 

);

hIcon

A handle to a previous icon.

bBigIcon

Specifies a 32 pixel by 32 pixel icon if TRUE; specifies a 16 pixel by 16 pixel icon if FALSE. 

[링크 : https://msdn.microsoft.com/ko-kr/library/9cb3b7b5.aspx]

'Programming > C Win32 MFC' 카테고리의 다른 글

MFC CMenu  (0) 2017.10.16
MFC 다이얼로그 창 크기 변경 못하도록 하기  (2) 2017.10.11
MFC 버튼에 이미지 넣기  (0) 2017.10.10
MFC CMenu 폰트 변경하기  (0) 2017.10.08
MFC String table  (0) 2017.09.29
Posted by 구차니