비트연산자

2012. 4. 9. 21:10 from PROGRAMMING/MFC(C++)

출처: http://www.winapi.co.kr/clec/cpp1/5-2-3.htm

 

아직도 헷갈리는 비트 연산, 시프트 연산...

 

5-2-다.비트 연산자

비트 연산자는 논리 연산자와 비슷하지만 비트를 연산 대상으로 한다는 점이 조금 다르다. 비트(bit)란 기억 장치의 최소 단위로서 1 또는 0을 기억하며 8개의 비트가 모여야 1바이트가 된다. 32비트의 정수 1234는 16진수로는 0x4d2이며 메모리에 다음과 같이 기억된다.

 

32비트이므로 32개의 비트가 있고 이 각각의 비트가 1이나 0을 기억함으로써 1234라는 숫자 하나를 저장하는 것이다. 비트 연산자는 이 그림에서 각 격자인 비트들을 대상으로 조작을 한다. 비트가 연산대상이라는 말은 두 피연산자의 대응되는 비트끼리 연산해서 그 결과를 리턴한다는 뜻이다. 일상 생활에서 쓰는 십진수와는 다른 이진수 차원의 연산이라 다소 어려운 것처럼 보이겠지만 막상 다 이해하고 나면 이진수만큼이나 간단하다.

과거 프로그램이 비디오 메모리를 직접 액세스할 때는 비트 연산이 굉장히 중요했으며 섬세한 처리를 하고자 할 때마다 꼭 사용되는 중요한 연산이었다. 비트를 잘 조작하면 반전, 스크롤, 투명 처리 등이 가능했으며 일반적인 산술 연산보다 훨씬 더 빠른 속도로 복잡한 연산을 할 수 있었다. 그러나 윈도우즈 환경에서는 비디오 메모리를 직접 액세스하는 것이 금지되었고 별로 그럴 필요도 없기 때문에 요즘은 비트 연산자가 많이 사용되지 않는다.

하지만 게임이나 중요한 시스템 소프트웨어에서는 아직도 비트 연산이 꼭 필요하며 활용 범위가 넓다. 스타일값 중 원하는 값을 추출하거나 액세스 권한 같은 플래그를 다룰 때 비트 연산자가 사용된다. 일단 비트 연산자의 종류에 대해 표로 간단하게 정리해 보자. 다음 여섯 가지가 있다.

 

연산자

설명

~

비트를 반전시킨다.

&

대응되는 비트가 모두 1 1이다.

|

대응되는 비트가 모두 0 0이다.

^

개의 비트가 달라야 1이다.

<<

지정한 수만큼 왼쪽으로 비트들을 이동시킨다.

>>

지정한 수만큼 오른쪽으로 비트들을 이동시킨다.

 

~만 단항 연산자이고 나머지는 모두 두 개의 피연산자를 취하는 이항 연산자이다. 비트 연산은 정수 수준에서만 의미가 있기 때문에 피연산자는 모두 정수형이거나 또는 정수로 자동 변환될 수 있는 타입이어야 한다. 실수나 포인터 등은 비트 연산자와 함께 사용할 수 없다. 다음은 비트 연산자들의 진리표인데 다 알고 있겠지만 도표로 정리해 보도록 하자.

 

b1

b2

b1 & b2

b1 | b2

b1 ^ b2

~b1

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

 

단항 연산자 ~는 가장 이해하기 쉬운 연산자이다. 비트가 1이면 0으로 0이면 1로 바꾸어 1의 보수로 만든다. a가 0x59라고 할 때 ~a가 어떻게 연산되는지 보자. 32비트 환경에서 정수는 32비트이지만 설명의 편의상(사실은 그림 그리기 귀찮으니까) a가 8비트 정수타입(unsigned char)이라고 하자.

 

0x59의 ~연산 결과는 비트를 모두 뒤집은 0xa6이 되는데 이 두 수는 1의 보수 관계이며 더하면 전체 비트가 모두 1인 0xff(이진수로 11111111)가 된다. 이렇게 그림으로 비트들이 어떻게 변하는지 보면 ~연산을 쉽게 이해할 수 있을 것이다. 만약 10진수로 이 연산자의 동작을 살펴보면 89의 ~연산 결과가 166이 되는데 89가 어떻게 166이 되었는지 직감적으로 이해하기 어렵다. 그래서 비트 연산자를 설명할 때는 2진수나 16진수를 쓸 수밖에 없으며 이 동작을 잘 이해하기 위해서는 2진수와 16진수 사이를 암산으로 신속하게 변환할 수 있어야 한다.

 

반전 연산자는 이미지 처리에 많이 사용되는데 이미지의 각 픽셀값을 반대로 뒤집으면 역상의 이미지를 얻을 수 있다. 흰색은 검정색이 되고 검정색은 흰색이 되기 때문에 역상 이미지가 만들어지는 것이다. Win32 환경에서는 API 함수들이 이런 처리를 대신해 주기 때문에 이 연산자를 직접 쓸 경우는 드물다.

 

&, | 연산자의 동작도 이해하기 쉬운데 특정 비트만 0으로 만들거나 또는 1로 만들 때 이 연산자들이 사용된다. a가 0x59일 때 a & 0xf(이진수 00001111)가 어떻게 연산되는지 보자.

 

 

&연산의 진리표를 보면 0과 &되는 비트는 그 값에 상관없이 무조건 0이 되며 1과 &되는 비트는 원래 비트값을 그대로 유지하는 특성이 있다. 이진수 00001111과 &연산을 하면 상위 4비트는 0이 되며 하위 4비트만 값을 유지한다. 이런 식으로 특정 비트를 강제로 0으로 만드는 연산을 마스크 오프(mask off)라고 한다. | 연산은 이와는 반대의 연산을 한다.

 

 

1과 |되는 비트는 무조건 1이 되고 0과 |되는 비트는 원래 값을 유지하는데 이렇게 특정 비트를 강제로 1로 만드는 연산을 마스크 온(mask on)이라고 한다. 마스크 연산이란 특정 비트에 덮개(mask)를 씌워 놓고 전부 0(off)이나 1(on)로 만든 후 덮개를 벗긴다고 생각하면 된다. 덮개가 씌워져 있던 비트는 원래 값을 유지하고 나머지 비트는 0이나 1로 강제 변환된다. & 연산에서는 1이 마스크이고 OR 연산에서는 0이 마스크이다.

&, | 연산자는 일부 비트만 제한적으로 읽거나 변경할 때 흔히 사용된다. 기억 공간을 절약하기 위해 하나의 정수값을 비트별로 잘라 여러 가지 값을 같이 기억시키는 방법이 많이 사용되는데 예를 들어 한글 조합형 코드는 16비트 길이를 가지며 다음과 같이 구성되어 있다.

 

 

최상위 비트는 항상 1인데 이 값은 이 코드가 한글임을 표시한다. 영문 알파벳은 모두 128보다 작기 때문에 이 비트가 0으로 되어 있어 한글과 구분된다. 16비트의 정수값을 5비트씩 잘라서 초성, 중성, 종성 코드를 기억시킨다. 한글 낱글자인 ㄱ,ㄴ,ㄷ,ㄹ,... 은 총 개수가 32개가 안되기 때문에 5비트면 낱글자 하나를 기억할 수 있고 이런 글자 세 개가 모이면 한글 1음절을 표현할 수 있다. 초성, 중성, 종성 코드를 각각의 정수에 기억하는 방법에 비해 훨씬 더 기억 공간이 절약된다. 이런 조합된 값에서 일부만 추출해 내거나 일부만 변경하려면 &, | 비트 연산이 필요하다. 다음은 한글 1음절의 값을 가지는 변수 Han을 비트 조작하는 예이다.

 

Han & 0x1f // 종성만 분리한다.

Han & 0x7c00 // 초성만 분리한다.

Han & 0xffe0 | 2 // 종성만 ㄱ으로 바꾼다.

 

윈도우의 스타일도 32비트의 정수에 각 스타일 비트들이 조합되어 있는데 이런 값들을 조작할 때도 비트 연산자가 사용된다. 다음에 API를 배울 때 보게 되겠지만 간단히 예만 보이자면 다음과 같다. style 변수에 32개나 되는 스타일 비트가 기억되어 있는데 다른 스타일값은 무시하고 WS_CHILD 값만 조사하거나 변경하고자 할 때 마스크 연산을 해야 한다.

 

if (style & WS_CHILD) // WS_CHILD 스타일을 가지고 있으면

style |= WS_CHILD // WS_CHILD 스타일 지정

 

XOR 연산자인 ^ 는 배타적 논리합이라고 부르며 ~연산자와 마찬가지로 비트를 반전시키는 기능을 하는데 ~연산자가 전체 비트를 반전시키는 반면 ^는 지정한 비트만을 반전시킨다. 배타적 논리합은 비트가 서로 다를 때만 1이 되고 같으면 0이 되기 때문에 1과 ^되는 비트는 반전되고 0과 ^되는 비트는 원래 값을 유지한다. 그래서 반전시키고자 하는 부분만 1로 만든 값과 ^연산을 취하면 원하는 부분만 반전된다. 이름하여 마스크 반전이라고 할 수 있다.

 

 

반전된 값은 다시 반전시키면 원래대로 돌아오는 특성이 있다. 1을 0으로 만들었다가 다시 반전하면 원래값 1이 되기 때문이다. 그래서 XOR 연산은 이미지의 이동이나 반복적인 점멸 처리에 사용된다. 캐럿이 깜박거리거나 텍스트의 선택 블록을 보여주는 처리가 모두 이 연산을 사용하는데 반복적으로 XOR 연산을 하면 원형을 손상하지 않고 복구 가능하기 때문이다.

 

Posted by 마마필로 :

출처: http://www.dolba.net/tt/k2club/entry/CString%EA%B3%BC-char%ED%98%95%EC%9D%98-%EC%83%81%ED%98%B8-%ED%98%95%EB%B3%80%ED%99%98

 

1. CString => char* 변환

char* ch;

CString *str;

1) ch = (LPSTR)(LPCSTR)str;

2) ch = str.GetBuffer(str.GetLength());

3) wsprintf(ch, "%s", str);

 

2. char* => CString 변환

1) str = (LPCSTR)(LPSTR)ch;

2) str = ch;

 

LPSTR: char string의 32비트 포인터, char*와 같다.

LPCSTR: Constant character String의 32비트 포인터

UNIT: 32비트 unsigned형 정수

DWORD: unsigned long int형

BYTE: 8비트 unsigned 정수

 

참고: CString을 const char* 형태로 변경 -> (LPTSTR)(LPCSTR)Cstring

 

 

Posted by 마마필로 :

1. CString::Left

http://msdn.microsoft.com/en-us/library/aa300477(v=vs.60).aspx

// example for CString::Left
CString s( _T("abcdef") );
ASSERT( s.Left(2) == _T("ab") );
 
 
2. CString::Mid
http://msdn.microsoft.com/en-us/library/aa300543(v=vs.60).aspx
// example for CString::Mid
CString s( _T("abcdef") );
ASSERT( s.Mid( 2, 3 ) == _T("cde") );
 
 
3. CString::Right
http://msdn.microsoft.com/en-us/library/aa300592(v=vs.60).aspx
 
// example for CString::Right
CString s( _T("abcdef") );
ASSERT( s.Right(2) == _T("ef") );
Posted by 마마필로 :

출처: http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=14876&ref=14876

 컨트롤에 멤버 변수를 추가할때 value 와 control 형의 차이점이 무엇이죠?   | VC++ 일반 2000-02-15 오후 6:46:00
박대근 번호: 14876  / 읽음:144
MFC를 공부하기 시작한 초보자 에요.
요즘 여러가지 컨트롤들을 공부하면서 이해하기 힘든게 있어요.
컨트롤의 아이디를 지어주고, 그것에 멤버 변수를 연결하잖아요?
그때, category에 value 와 control 이 있는데, 어떤때 value를 
선택하고, 어떤때 control을 선택해야 하는거죠?
처음에는 value를 선택할때는 멤버변수를 값으로 필요할때 선택하는줄
알았는데, 리스트박스 컨트롤을 생성할때는 value를 선택해도 type에는 CString
클래스가 나오더라구요. int 같은 정수형이 아닌 클래스가요...
제가 잘못 이해하고 있는것 같기도 하고, 
어째든 value 와 control 을 사용할 시기에 대해서 설명해 줄실분 없나요?
이 글에 답변 등록하기

         [답변][답변]컨트롤에 멤버 변수를 추가할때 value 와 contr 2000-02-15 오후 6:59:00
김진수 번호: 14877  
control로 선택하는 것은 Window자체를 사용하겠다는 것입니다.
가령 ListCtrl을 control로 변수선언하면
그 ListCtrl의 모든것을 이용할 수 있습니다.
가령, Window를 옮긴다거나, 크기를 변경한다거나

그러나 value로 선택하는 것은 control로 선언할 때 처럼
window 자체로 사용하지 않고 value로만 사용한다는 것입니다.

하나의 Window Control로 두가지 형태 모두 선언할 수도 있습니다.

UpdateData()함수를 더 공부해 보시길...

이렇게 봐도 아직 잘 이해가 안된다.

control형은 어떤것에 대한 컨트롤이 필요할때?

 

value형은 연결된 값만 가지고 사용할때?

대충 이해한건 이정도...

 

 

Posted by 마마필로 :


1. OnOK() 함수 재정의 후, OnOK() 호출 주석처리

void CSocketTestDlg::OnOK()
{
 // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.

 //CDialog::OnOK();
}


2. PreTranslateMessage() 재정의

if(pMsg->message == WM_KEYDOWN)
{

if(pMsg->wParam == VK_RETURN)
{

return TRUE;

}

}

//Enter키를 아예 막아버리는 코드. Enter키 입력을 받을 수 없음.

Posted by 마마필로 :

반복문(loop문)

2011. 8. 8. 19:19 from PROGRAMMING/C

1. while문
특정 조건을 주고 그 조건이 만족될 때까지 계속 반복

while( 반복 조건)
{
반복 내용
}

while문의 중괄호는 둘 이상의 문장을 묶기 위해 사용.
반복하고자 하는 문장이 하나인 경우에는 중괄호를 쓰지 않아도 된다.

while문을 이용한 무한 루프
while(1) //반복의 조건 대신 0 이 아닌 정수를 넣는다.
{
printf("Hello World! \n");
i++;
}
//0 이 아닌 모든 수는 true로 인식되기 대문에 반복의 조건은 항상 true가 되어 무한 루프에 빠진다.
//무한루프에서 빠져나오려면 Ctrl+C



2. do~while문
while문은 조건이 만족되지 않으면 루프를 한번도 실행하지 않게 되지만, do~while문은 반드시 한번은 루프를 실행하게 되어 있다.

do
{
반복 내용
}while( 반복 조건);


3. for문
for문은 초기문, 조건문, 증감문 3개의 문장을 기본적으로 포함하고 있다.

for(초기문; 조건문; 증감문)
{
반복하고자 하는 내용
}
Posted by 마마필로 :


■ 가장 많이 쓰이는 서식 문자들
%c: 단일 문자
%d: 부호 있는 10진 정수
%f: 부호 있는 10진 실수
%s: 문자열

■ 부호 없는 정수형 출력(unsigned가 붙은 자료형의 변수 출력)
%o: 부호 없는 8진 정수
%u: 부호 없는 10진 정수
%x: 부호 없는 16진 정수, 소문자 사용
%X: 부호 없는 16진 정수, 대문자 사용

■ '부동소수점 표현 방식'에 의한 출력(실수 표현)
%e: e 표기법에 의한 실수
%E: E 표기법에 의한 실수

■ 표현하고자 하는 실수의 값이 소수점 이하 6자리인 경우 %f의 형태로 출력.
이 범위를 넘길 경우 %e의 형태로 출력
%g: 값에 따라서 %f, %e 둘 중 하나를 선택
%G: 값에 따라서 %f, %E 둘 중 하나를 선택

%i: 부호 있는 10진 정수, %d와 같음
%%: %기호 출력

■ 필드 폭을 지정하여 출력
%8d: 필드 폭을 8칸 확보하고 오른쪽 정렬해서 출력
%-8d: 필드 폭을 8칸 확보하고 왼쪽 정렬해서 출력
%+8d: 필드 폭을 8칸 확보하고 오른쪽 정렬한 상태에서 양수는 +, 음수는 -를 붙여서 출력

'PROGRAMMING > C' 카테고리의 다른 글

반복문(loop문)  (0) 2011.08.08
논리연산과 비트연산  (0) 2011.08.03
[수업후] Double Pointer, scope연산자  (0) 2011.04.22
[수업후] 포인터, const  (0) 2011.04.21
[수업후] 포인터와 배열  (0) 2011.04.20
Posted by 마마필로 :

1. 논리연산
-논리연산자(&&, ||, !): and, or, not을 표현하는 연산자
-true(1) 나 false(0)로 값을 반환한다.
-논리연산자와 의미

&&: 피연산자가 모두 참이면 true를 반환(and)
||:  피연산자 중 하나라도 참이면 true를 반환(or)
!: 피연산자가 true면 false를, false면 true를 반환(not)


2. 비트단위 연산
2.1 비트 연산자와 의미 (결합성은 모두 → )
&: 비트 단위 AND (ex. a & b)
|: 비트 단위 OR (ex. a | b)
^: 비트 단위 XOR (ex. a ^ b)
~: 비트 단위 NOT (ex. ~a)
<<: 왼쪽으로 이동 (ex. a<<2)
>>: 오른쪽으로 이동 (ex. a>>2)

2.2 & 연산자: 비트 단위 AND
두 개의 비트가 모두 1일 때 1을 반환
0 & 0 → 0을 반환
0 & 1 → 0을 반환
1 & 0 → 0을 반환
1 & 1 → 1을 반환

2.3 | 연산자: 비트 단위 OR
두 개의 비트 중 하나라도 1이면 1을 반환
0 | 0 → 0을 반환
0 | 1 → 1을 반환
1 | 0 → 1을 반환
1 | 1 → 1을 반환

2.4 ^연산자: 비트 단위 XOR
두 개의 비트가 서로 다를 경우 1을 반환
0 ^ 0 → 0을 반환
0 ^ 1 → 1을 반환
1 ^ 0 → 1을 반환
1 ^ 1 → 0을 반환

2.5 ~연산자: 비트 단위 NOT
보수 연산. 비트를 반전 시킴
~0 → 1을 반환
~1 → 0을 반환

2.6 <<,>> 연산자: 비트 이동(shift)
<< 연산자: 왼쪽 쉬프트(shift) 연산 (1칸 왼쪽 이동 → *2)
ex.
a<<b → a의 비트들을 b칸씩 왼쪽으로 이동한 값을 반환
8<<2 → 8의 비트들을 왼쪽으로 2칸씩 이동한 값을 반환

>> 연산자: 오른쪽 쉬프트(shift) 연산 (1칸 오른쪽 이동 → /2)
ex.
a>>b → a의 비트들을 b칸씩 오른쪽으로 이동한 값을 반환
8>>2 → 8의 비트를 왼쪽으로 2칸씩 이동한 값을 반환





'PROGRAMMING > C' 카테고리의 다른 글

반복문(loop문)  (0) 2011.08.08
서식 문자(Conversion Specifier)의 종류와 그 의미  (0) 2011.08.04
[수업후] Double Pointer, scope연산자  (0) 2011.04.22
[수업후] 포인터, const  (0) 2011.04.21
[수업후] 포인터와 배열  (0) 2011.04.20
Posted by 마마필로 :

[CAsyncSocket 클래스의 주요 함수]

 

생성자

CAsyncSocket : CAsyncSocket 객체를 생성한다.

 

메서드

Create : 소켓을 생성한다.

Accept : 소켓에 연결을 받아들인다.

Bind : 소켓에 로컬 주소를 연결한다.

Close : 소켓을 닫는다.

Connect : 상대방 소켓에 연결을 맺는다.

Listen : 연결 요구를 기다린다.

Receive : 소켓으로부터 데이터를 받는다.

Send : 연결된 소켓으로 데이터를 전송한다.

 

*CSocket클래스는 CAsyncSocket 클래스의 파생 클래스이므로 CAsyncSocket 클래스의 주요 함수를 모두 사용할 수 있다.

 

 

 

출처: 성윤정,<<Visual C++ MFC 윈도우프로그래밍>>, 인피니티북스, 2009


Posted by 마마필로 :

Windows Service Process

주로 시스템 트레이에 등록되어 있는 프로그램들로

화면(창)이 사라져도 프로그램이 종료되지 않고 계속 실행되고 있는 것들.

 

Shell Interface: 데이타나 파일이나 디렉토리등을 보여줄 수 있는 화면

 

1. 프로그램 실행시 트레이에 아이콘이 들어가게 함

-트레이에 아이콘이 박히는 시점 결정. 함수가 호출되는 시점

 

1.1 함수 구현(트레이에 아이콘이 박히는 시점과 관련된)

응용프로그램에서의 편리한 제어를 위해 MainFrame에 구현

 

MainFrame.h파일에 원형 선언

void ViewTray(void);

 

MainFrame.cpp파일에 코드 구현

 // CMainFrame 메시지 처리기

 

 void CMainFrame::ViewTray(void)
  {
  NOTIFYICONDATA nid;
  ::ZeroMemory(&nid, sizeof(nid));
 
  nid.cbSize     =sizeof(nid);
  nid.hWnd     =m_hWnd;
  nid.uID      =IDR_MAINFRAME;
  nid.uFlags     =NIF_MESSAGE | NIF_ICON | NIF_TIP;
  nid.uCallbackMessage =UM_TRAY;
  nid.hIcon     =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  wsprintf(nid.szTip, _T("%s"), _T("메롱!"));
 
  ::Shell_NotifyIcon(NIM_ADD, &nid);  // 트레이 아이콘에 넣음
 }

 

1.2 전역헤더(stdafx.h)에 UM_TRAY 메시지 선언

#define UM_TRAY WM_USER + 100

 

ViewTray함수 구현만 하고 아직 호출하지는 않았으므로 이 단계까지는 아직 트레이에 들어가지 않는다.

프로그램이 실행되면 바로 트레이에 들어가도록 하기 위해

이 함수가 호출되는 시점은... 메인 프레임이 다 완성된 후에 시스템 트레이에 올려주기 위해

OnCreate함수에서 리턴되기 직전에 호출해 주는 것이 좋다.

 

트레이 영역에 아이콘을 넣는 것은 윈도우의 쉘서비스가 하는 일.

프로그래머는 구조체를 채워 던져주는 역할만.

 

2. 창을 닫아도 시스템트레이에서 사라지지 않도록.

 Onclose메시지 재정의

-프로그램이 종료되지 않도록 OnClose함수가 실해되지 않게 해주고

창은 숨겨준다.

void CMainFrame::OnClose()
{
 ShowWindow(SW_HIDE);
 // CFrameWndEx::OnClose(); // 응용 프로그램의 종료를 막기위해 주석처리.
}

 

3. 아이콘을 더블클릭하면 프로그램이 다시 실행되도록.

트레이 아이콘이 메시지를 받을 수 있도록 한다.

 

 

윈도우를 종료할 때

 

WM_Close

WM_Destory

WM-Quit

 

순서로 메시지 큐에 쌓이면서 윈도우가 종료됨

Quit은 응용프로그램을 완전히 종료하므로 개발자가 재정의 할 수 없음.

 

Onclose에 넣었을 경우 응용프로그램이 종료되는것 위에서 확인했음

 

따라서, WM_Destory를 이용해서 창을 닫아도 트레이에서 아이콘이 사라지지 않도록 해준다.

 

void CMainFrame::OnDestroy()
{
 NOTIFYICONDATA nid;
 nid.cbSize    =sizeof(nid);
 nid.hWnd    =m_hWnd;
 nid.uID     =IDR_MAINFRAME;

 ::Shell_NotifyIcon(NIM_DELETE, &nid);

 CFrameWndEx::OnDestroy();

}

 

cf.) 프로그램이 실행되는 순서? 이벤트 발생-메시지발생-메시지에 대응하는 이벤트 처리 함수

 

4. 리소스뷰-Menu-리소스뷰 추가

 

EXIT, ABOUT버튼은 따로 코드 구현필요없이 속성-ID수정으로 가능(ID_APP_EXIT, ID_APP_ABOUT로)

 

5. 이벤트처리기(사용자 정의 함수) 생성

 

선언(사용자 정의 함수의 선언은 메시지 맵 함수 안에.)-MainFrm.h

사용자 정의 함수의 선언은 메시지 맵 함수 안에.

// 생성된 메시지 맵 함수
protected:
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnApplicationLook(UINT id);
 afx_msg void OnUpdateApplicationLook(CCmdUI* pCmdUI);
 afx_msg void OnFilePrint();
 afx_msg void OnFilePrintPreview();
 afx_msg void OnUpdateFilePrintPreview(CCmdUI* pCmdUI);
 DECLARE_MESSAGE_MAP()

 void InitializeRibbon();
public:
 afx_msg LRESULT OnTray(WPARAM wParam, LPARAM lParam);
 afx_msg void OnClose();
 afx_msg void OnDestroy();
};

메시지 맵 등록

 

 

구현-MainFrm.cpp

LRESULT CMainFrame::OnTray(WPARAM wParam, LPARAM lParam)
{
 if (lParam == WM_RBUTTONDOWN)
 {
  SetCapture();
 }
 else if(lParam == WM_RBUTTONDOWN)
 {
  CMenu menu, *pMenu = NULL;
  CPoint pt;

  menu.LoadMenu(IDR_MENU1);
  pMenu = menu.GetSubMenu(0);

  GetCursorPos(&pt);
  SetForegroundWindow();
  pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, this);

  ::PostMessage(m_hWnd, WM_NULL, 0, 0);
  ReleaseCapture();
 }
 else if (lParam == WM_LBUTTONDBLCLK)
 {
  ShowWindow(SW_SHOW);
  SetForegroundWindow();
 }
 return 0;
}

6. 리소스뷰-MainFrame 메뉴 추가

.....


'PROGRAMMING > MFC(C++)' 카테고리의 다른 글

Dialog에서 Enter키 종료 방지  (0) 2012.02.23
소켓 프로그래밍 주요함수  (0) 2011.04.27
[0425수업] dll파일 만들기  (0) 2011.04.25
[0425수업] ClipBoard  (0) 2011.04.25
[0422수업] IPC통신  (0) 2011.04.22
Posted by 마마필로 :