유돌이

calendar

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

Notice

2009. 2. 9. 21:37 C/C++/MFC

- ExitProcess() 

  1. 프로세스와 연결된 모든 DLL을 종료시키기 위해 각 DLL의 DllMain함수가 호출되며 DLL들은 스

     스로 정리작업을 한다.

  2. 모든 열려진 핸들을 닫는다.(핸들 테이블 제거)

  3. 실행중인 모든 쓰레드를 종료한다.

  4. 프로세스 커널 객체와 쓰레드 객체의 상태가 신호상태로 되며 이 신호를 기다리는 다른 프로세스 

     대기 상태를 해제할 수 있다.

  5. 프로세스의 종료코드는 STILL_ACTIVE에서 ExitProcess()인자로 지정한 값으로 변경된다.

  6. 곧바로 정리 작업에 들어가기 때문에 ExitProcess()함수의 다음 코드는 실행되지 않는다.

 

- PostQuitMessage()

   단지 메시지 맵에 WM_QUIT 메시지만 전달하는 것이기 때문에 다음 코드도 실행이 된다.

 

- TerminateProcess()

   1. 자기 자신이 아닌 다른 프로세스를 종료시킬 수 있다.

   2. 정리 작업을 하지 않기 때문에 되도록 금지되는 함수


'C/C++/MFC' 카테고리의 다른 글

인터페이스와 COM의 의미  (0) 2009.02.09
PostQuitMessage  (0) 2009.02.09
윈도우 핸들 구하는 방법  (0) 2009.02.09
트레이로 가는 애니메이션 출력하기  (0) 2009.02.09
string::find와 string::npos 란?  (0) 2009.02.09
posted by 유돌이
2009. 2. 9. 21:37 C/C++/MFC
윈도우제목과 윈도우클래스명으로 윈도우핸들 찾기!

연결파일 : user32.dll
함수 :
   실수함수: FindWindowA(문자: 클래스명, 윈도우제목);
예제 : [클래스명이 'TNHForm'이고, 창 제목이 '창0'인 창을 찾습니다.]
   핸들 := 사용자함수0.FindWindowA("TNHForm", "창0");
주의 :
   만일 클래스명 및 윈도우제목도 같은 프로그램이 있다면 난감합니다;
참고 :
   더 상세한 함수를 원하신다면 FindWindowExA 를 참고해주세요.


윈도우제목과 윈도우클래스명으로 윈도우핸들 찾기[고급]!

연결파일 : user32.dll
함수 :
   실수함수: FindWindowExA(실수: 부모창, 다음창; 문자: 클래스명, 윈도우제목);
설명 :
   부모창 - 부모창의 핸들에서 자식 객체를 찾습니다. 사용 안할경우 0을 넣으시면 됩니다.
   다음창 - 여기에 특정 창의 핸들을 넣으시면 그 특정창 다음부터 창을 찾습니다.
               [동일한 클래스명과 제목명이 여러개 있을경우 편리합니다.]
               역시 사용안하시려면 0 을 넣으시면 됩니다.
   클래스명과 윈도우제목은 FindWindowA 와 동일합니다.
예제 : [클래스명이 'TNHForm'이고, 창 제목이 '창0'인 창을 찾습니다.]
   핸들 := 사용자함수0.FindWindowA(0, 0, "TNHForm", "창0");


특정 좌표에 있는 윈도우의 핸들찾기!

연결파일 : user32.dll
함수 :
   실수함수: WindowFromPoint(실수: X, Y);
예제 : [X좌표 200 Y좌표 300에 위치한 창의 핸들을 얻습니다.]
   핸들 := 사용자함수0.WindowFromPoint(200, 300);


현재 활성화된 창의 핸들 찾기!
연결파일 : user32.dll
함수 :
   실수함수: GetActiveWindow;
예제 :
   핸들 := 사용자함수0.GetActiveWindow;


현재 포커스[초점]이 있는 윈도우의 핸들찾기!

연결파일 : user32.dll
함수 :
   실수함수: GetFocus;
예제 :
   핸들 := 사용자함수0.GetFocus;


가장 앞에있는 창의 윈도우핸들 찾기!

연결파일 : user32.dll
함수 :
   실수함수: GetForegroundWindow;
예제 :
   핸들 := 사용자함수0.GetForegroundWindow;



그외, 함수를 구하는 방법에는 여러가지가 있습니다.
다음창의 핸들구하기, 이전창의 핸들구하기
부모창의핸들 구하기, 데스크탑윈도우 핸들구하기
가장 처음창의 핸들구하기, 가장 마지막창의 핸들구하기
소유 윈도우의 핸들구하기 등등..


여러가지 방법등이 있지만, 가장 많이쓰는 것들을 소개해봤습니다.

Tip & 팁!)
   가장 고질병인 ㅎ밑판등의 핸들 구하기!..
   밑판의 핸들구하려고, 창조웹브라우저의 함수를 사용하거나, 여러가지 방법으로 어렵게
   핸들속성이 없는 객체의 핸들을 구하셨나요?-_-;

   ㅎ밑판의 핸들구하기!.. :
       밑판0.활성화해;
       핸들 := 사용자함수0.GetFocus;

'C/C++/MFC' 카테고리의 다른 글

PostQuitMessage  (0) 2009.02.09
ExitProcess(), TerminateProcess(), PostQuitMessage() 차이점  (0) 2009.02.09
트레이로 가는 애니메이션 출력하기  (0) 2009.02.09
string::find와 string::npos 란?  (0) 2009.02.09
DoModal() 이란??  (0) 2009.01.14
posted by 유돌이
2009. 2. 9. 21:36 C/C++/MFC

1. Introduction
MSN 메신저가 설치되어 있다면 메신저를 한번 열어보자. 아마 등록된 친구들의 목록이 나오는 윈도우가 화면에 나타날 것이다. 이번에는 그 윈도우의 우측 상단에 있는 닫기 버튼을 눌러서 메신저 윈도우를 닫아 보자. 그럼 아마도 윈도우가 사라지면서 우측 하단의 트레이로 캡션바가 사라지는 애니메이션이 표시될 것이다. 무슨 말인지 잘 모르겠다면 메신저 화면을 띄우고 최소화 시켜 보자. 그럼 작업 영역으로 내려가는 애니메이션이 표시될 것이다. 다시 활성화 시켜서 닫아 보자. 그럼 금방 그 둘의 차이를 알 수 있을 것이다.

트레이로 내려가는 애니메이션. 아주 사소한 것이다. 하지만 사용자 입장에서는 이 사소한 하나가 프로그램의 완성도를 살피는 중요한 척도가 된다. 자, 그럼 이제 트레이로 내려가는 애니메이션을 출력하는 방법에 대해서 알아보도록 하자.

 

 

2. DrawAnimatedRects
구현의 핵심은 DrawAnimatedRects API 다. 벌써 이름에서 냄새를 풍기고 있다. 애니메이션 사각형을 그리는 함수겠거니 짐작했다면 정답이다. 함수 원형과 함께 사용법을 알아보도록 하자. view plaincopy to clipboardprint?
BOOL DrawAnimatedRects(  
  HWND hwnd,            // handle to clipping window  
  int idAni,            // type of animation  
  CONST RECT *lprcFrom, // rectangle coordinates (minimized)  
  CONST RECT *lprcTo    // rectangle coordinates (restored)  
); 
BOOL DrawAnimatedRects(
  HWND hwnd,            // handle to clipping window
  int idAni,            // type of animation
  CONST RECT *lprcFrom, // rectangle coordinates (minimized)
  CONST RECT *lprcTo    // rectangle coordinates (restored)
);

 

MSDN에서 발췌한 함수의 원형이다. 파라미터는 다음과 같은 의미를 가진다.

hwnd - 윈도우 핸들이다. 애니메이션을 출력할 윈도우의 핸들을 넣어주시면 된다.
idAni - 애니메이션 종류 번호다. 지금까지 출시된 윈도우에서 지원하는 타입은 IDANI_CAPTION 밖에 없다. 따라서 무조건 저 값을 넣으면 된다.
lprcFrom, lprcTo - 사각형 구조체 포인터를 넘긴다. lprcFrom에서 lprcTo로 움직이는 애니메이션이 출력된다.
리 턴 값은 당연히 성공하면 0이 아닌 값을, 실패 시에 0을 리턴 한다. 이제 이 함수에 대해서 대충 감이 잡히셨다면 샘플 코드를 한번 보도록 하자. 여기서 꼭 한번 직접 타이핑해서 결과를 확인해 보도록 하자. 백문이불여일견 이라는 옛말이 있듯이, 백 번 보는 것보다 직접 타이핑해서 결과를 확인하는 것이 더욱 기억에 오래 남는다는 것을 명심하자. CRect rc;  
CRect rc2;  
 
GetWindowRect(rc);  
rc2 = rc;  
rc2.OffsetRect(100, 100);  
DrawAnimatedRects(m_hWnd, IDANI_CAPTION, rc, rc2); 
CRect rc;
CRect rc2;

GetWindowRect(rc);
rc2 = rc;
rc2.OffsetRect(100, 100);
DrawAnimatedRects(m_hWnd, IDANI_CAPTION, rc, rc2);

 

쉽다. 윈도우 영역을 구해서 100, 100만큼 오른쪽 아래 있는 사각형으로 이동하는 애니메이션을 출력하는 것이다. 실행해 봤다면 아! 하고 느꼈을 것이다.

 

 

3. 트레이는 어디에?
2장까지 읽고는 이제 게임 끝... 하고 덮으시려는 분들이 있을 것 같다. 하지만 한가지 문제가 더 남아 있다. 어디서 어디로 가는 애니메이션을 출력하는가? 라는 문제다. 출발 지점은 당연히 윈도우의 영역이 될 것이고, 종료 지점은 트레이 영역이 될 것이다. 이제 트레이 영역을 구하는 방법만 알면 진짜 게임이 끝나는 거다.

트레이 영역을 찾기 위해서 윈도우 구조를 조금 조사할 필요가 있다. 이럴 때 강력한 힘을 발휘할 수 있는 SPY++을 실행해보자. 그리고 직접 한번 트레이를 찾아 보자. 아직 SPY++의 사용법을 모른다면 지금 당장 배울 필요가 있다. 윈도우 개발을 함에 있어 VC++에 포함된 Depends와 SPY++은 아주 유용한 도구다. 시간이 날 때 꼭 사용법을 익혀 놓도록 하자.

발견한 트레이 윈도우 구조는 왼쪽과 같다. 전체를 둘러싸고 있는 큰 파란 사각형의 윈도우 클래스 명은 "Shell_TrayWnd"다. 그 안을 둘러싸고 있는 빨간 사각형 윈도우의 클래스 명은 "TrayNotifyWnd"다. 끝으로 그 안에 들어있는 보라색 윈도우의 클래스 명은 "ToolbarWindow32"다. 모두 윈도우 명은 없다. 그러나 끝에 찾은 보라색 윈도우의 경우 9x 계열에서는 없다. 2000이상의 버전부터 툴 바 윈도우가 생겼다. XP부터는 Pager란 놈까지 생겼다. 하여튼 여기서 중요한 점은 Shell_TrayWnd와 TrayNotifyWnd는 운영체제에 상관없이 공통된 속성이라는 점이다.

그럼 이제 윈도우만 찾으면 된다~ 윈도우를 찾는 건 너무나 쉽다. 훌륭한 FindWindow API를 사용하면 된다. TrayNotifyWnd를 찾는 FindWindow 코드는 아래와 같다.

  1. HWND hTrayP = FindWindow("Shell_TrayWnd", NULL);   
  2. HWND hTrayC = FindWindowEx(hTrayP, NULL, "TrayNotifyWnd", NULL);  

간단하게 설명하면 첫째 줄에서 Shell_TrayWnd를 찾고, 그 다음 줄에서 ShellTrayWnd의 자식 중에 TrayNotifyWnd를 찾는 코드다.

 

4. 모두 합쳐봐~

이제 드디어 2,3장에 걸쳐서 배웠던 지식을 활용해서 트레이로 가는 애니메이션을 출력하는 함수를 작성해 보도록 하자. 아래에 샘플로 작성해둔 함수가 있다.

  1. VOID SendTrayAnimation(HWND hwnd, BOOL bTo)    
  2. {    
  3.        RECT       rcFrom, rcTo;    
  4.            
  5.        HWND hTrayP = FindWindow("Shell_TrayWnd", NULL);    
  6.        HWND hTrayC = FindWindowEx(hTrayP, NULL, "TrayNotifyWnd", NULL);    
  7.            
  8.        if(hTrayC)    
  9.        {    
  10.               GetWindowRect(hTrayC, &rcTo);    
  11.        }    
  12.        else    
  13.        {    
  14.               SystemParametersInfo(SPI_GETWORKAREA, 0, &rcTo, 0);    
  15.                   
  16.               rcTo.left = rcTo.right - 118;    
  17.               rcTo.top = rcTo.bottom - 30;    
  18.        }    
  19.            
  20.        GetWindowRect(hwnd, &rcFrom);    
  21.   
  22.        if(bTo == TRUE)    
  23.               DrawAnimatedRects(hwnd, IDANI_CAPTION, &rcFrom, &rcTo);    
  24.        else    
  25.               DrawAnimatedRects(hwnd, IDANI_CAPTION, &rcTo, &rcFrom);    
  26. }   

 

첫 번째 인자는 윈도우 핸들을, 두 번째 인자는 TRUE를 넣을 경우 트레이로 내려가는 애니메이션을, FALSE를 넣을 경우 트레이에서 본래 윈도우로 돌아오는 애니메이션을 출력한다.

'C/C++/MFC' 카테고리의 다른 글

ExitProcess(), TerminateProcess(), PostQuitMessage() 차이점  (0) 2009.02.09
윈도우 핸들 구하는 방법  (0) 2009.02.09
string::find와 string::npos 란?  (0) 2009.02.09
DoModal() 이란??  (0) 2009.01.14
C_STR() 이란??  (0) 2009.01.10
posted by 유돌이
2009. 2. 9. 21:35 C/C++/MFC

String::find()를 통하여 원하는 단어나 문장을 검색후

원하는 값의 유무를 string::npos()를 통하여 알수 있다.

 

string::find()함수는 찾는 단어나 문자열이 없으면 

string::npos를 리턴한다.

 

 

---------------------------------------------------------------------------------

예제)

 

string str_text = "테스트 입니다."

 

if ( str_text.find("텍스트") == string::npos) {

    MessageBox("문자를 찾을수가 없습니다.", "테스트",  MB_OK);

}


'C/C++/MFC' 카테고리의 다른 글

윈도우 핸들 구하는 방법  (0) 2009.02.09
트레이로 가는 애니메이션 출력하기  (0) 2009.02.09
DoModal() 이란??  (0) 2009.01.14
C_STR() 이란??  (0) 2009.01.10
연결리스트 삽입,삭제 구현 예제(스택)  (0) 2009.01.10
posted by 유돌이
2009. 1. 14. 22:25 C/C++/MFC

비주얼 C++에 다이얼로그는 두가지 종류가 있습니다.

 

한가지가 모달리스 다이얼로그이고...

또 다른 한가지가 모달 다이얼로그입니다.

 

이 두 다이얼로그의 차이는

모달 다이얼로그의 경우는 다이얼로그가 생성되면

자신을 생성시킨 다이얼로그가 활성화되지 않습니다.

 

하지만 모달리스 다이얼로그는 다이얼로그가 생성되더라도

자신을 생성시킨 다이얼로그로 마음대로 왔다 갔다 할 수 있습니다.

 

사실 이게 정확한 설명은 아니지만 대략의 차이점이라고 생각하시면 될 것 같고..^^;;

 

 

DoModal 함수에 대한 간단한 예제를 들면...

 

일단 모달 다이얼로그로 클래스가 생성되어 있다고 하죠...

그 클래스 이름을 "TestClassModal" 이라고 했을 때...

 

다이얼로그를 생성시킬 곳에서는

일단 해당 다이얼로그 클래스의 해더 파일을 포함시켜야 할 거구요..

 

그 다음에는 그 클래스를 선언해 주어야 겠지요~^^

 

TestClassModal   dlg;

 

if (dlg.DoModal == IDOK)   // 다이얼로그가 종료될 때 반환되는 값을 검사, OK 버튼으로 종료되었을 경우 IDOK를 반환

{

      // OK 로 다이얼로그가 종료되었을 경우의 작업 코딩

}

else

{

       // 그렇지 않을 경우의 작업 코딩..

}

 

 

DoModal 함수는 보통 위와 같은 형태로 사용됩니다.


'C/C++/MFC' 카테고리의 다른 글

트레이로 가는 애니메이션 출력하기  (0) 2009.02.09
string::find와 string::npos 란?  (0) 2009.02.09
C_STR() 이란??  (0) 2009.01.10
연결리스트 삽입,삭제 구현 예제(스택)  (0) 2009.01.10
가상 상속  (0) 2009.01.10
posted by 유돌이
2009. 1. 10. 13:42 C/C++/MFC

c_str()

 

      [설명] string을 char *로 변환할려고 할때 사용

      [예제] eStr이란 배열에 "hello"란 String을 넣으면 에러가 발생하는데

                이를 해결하기 위해 c_str을 사용한다.

        

 

char eStr[10];

string eTxt = "hello";

eStr = eTxt.c_str();


'C/C++/MFC' 카테고리의 다른 글

string::find와 string::npos 란?  (0) 2009.02.09
DoModal() 이란??  (0) 2009.01.14
연결리스트 삽입,삭제 구현 예제(스택)  (0) 2009.01.10
가상 상속  (0) 2009.01.10
" call by value " 와 " call by reference " 의 차이점  (0) 2009.01.10
posted by 유돌이
2009. 1. 10. 13:41 C/C++/MFC

#include <stdio.h>
struct node{
 int i;
 struct node* link;
}*p;
int insert(int a);
int printe();
int delet(int c);

void main()
{
 p=NULL;
 insert(3);
 insert(4);
 insert(5);
 delet(4);
 printe(p);
}
int insert(int a)
{
 struct node *temp;
 temp=(struct node *)malloc(sizeof(temp));
 temp->i=a;
 temp->link=p;
 p=temp;
 return 0;
}

int printe()
{
 struct node *t;
 t=p;
 while(t!=NULL){
   printf("%d \n", t->i);
   t=t->link;
 }
 return 0;
}

int delet(int c)
{
 struct node *m;
 struct node *n; 

 m=p;
 if(m->i == c)
 {
  p=p->link;
 } 
 else{
  n=m;
  m=n->link;
  while(m!=NULL){
   if(m->i==c){
    n->link=m->link;
    break;
   }
   else{
    n=m;
    m=m->link;
   }
  }
 
  
 }
 return 0;
}


'C/C++/MFC' 카테고리의 다른 글

DoModal() 이란??  (0) 2009.01.14
C_STR() 이란??  (0) 2009.01.10
가상 상속  (0) 2009.01.10
" call by value " 와 " call by reference " 의 차이점  (0) 2009.01.10
API 종료 방법  (0) 2009.01.10
posted by 유돌이
2009. 1. 10. 13:40 C/C++/MFC
출처 Sujin's home | 예섬
원문 http://blog.naver.com/psjin14/100016885851
 

  2개의 클래스를 상속 받는 클래스 D가 있다고 하자. 이 2개의 클래스 A, B가 다시 하나의 공통된 클래스 C를 상속 받는다고 하자. A,B는 C를 상속 받으므로 결국 클래스 D에는 C부분이 2개가 생기게 된다. 이렇게 생성된 D클래스에서 C의 멤버 함수를 호출하려고 할 때 모호함으로 인해 error가 발생하므로 명시적으로 어느 부분에 있는 멤버 함수를 호출하겠다고 적을 수 있다.

   ex> return A::GetAge;(C 클래스에 GetAge()함수가 있다고 가정하자.)

 

  이렇게 해서 문제를 해결할 수 있지만 근본적인 해결책은 되지 않는다. 클래스 D에 C부분이 1개가 되게 만들 수 없을까? 이 방법이 바로 가상 상속이다.

  보통 클래스의 생성자는 그 자신의 변수와 기반 클래스를 초기화한다. 그러나 가상 상속된 기반 클래스는 예외이다. 이 것들은 최하위 파생(most derived) 클래스에 의해 초기화된다.

 

  그러므로 첨부된 파일 예제에서 Animal는 Horse나 Bird에 의해서가 아니라 Pegasus에 의해 초기화된다. Horse와 Bird는 각 생성자에서 Animal을 초기화해야 하지만, 이러한 초기화는 Pegasus 객체가 만들어 질 때 무시될 것이다.

 

※ 가상 상속 예

   class Bird : virtual public Animal


'C/C++/MFC' 카테고리의 다른 글

C_STR() 이란??  (0) 2009.01.10
연결리스트 삽입,삭제 구현 예제(스택)  (0) 2009.01.10
" call by value " 와 " call by reference " 의 차이점  (0) 2009.01.10
API 종료 방법  (0) 2009.01.10
메뉴 항목 체크/ 해지 하기  (0) 2009.01.10
posted by 유돌이
2009. 1. 10. 13:39 C/C++/MFC

 [Call by Value]

 

인자를 전달하여 그 인자를 연산한 단일한 결과를 구하고 싶을 때

 

 

[Call by reference]

 

인자를 전달하여 두개 이상의 결과값을 구하고 싶을 때


'C/C++/MFC' 카테고리의 다른 글

연결리스트 삽입,삭제 구현 예제(스택)  (0) 2009.01.10
가상 상속  (0) 2009.01.10
API 종료 방법  (0) 2009.01.10
메뉴 항목 체크/ 해지 하기  (0) 2009.01.10
API 컨트롤 숨기기, 나타내기  (0) 2009.01.05
posted by 유돌이
2009. 1. 10. 13:39 C/C++/MFC

[컴퓨터 종료 ]

ExitWindowsEx(EWX_SHUTDOWN,0);

 

※ Flag 값 : EWX_LOGOFF, EWX_POWEROFF, EWX_REBOOT

 

 

[프로그램 종료(다이얼로그 기반)]


 EndDialog(IDOK);
 CDialog::OnClose();


'C/C++/MFC' 카테고리의 다른 글

가상 상속  (0) 2009.01.10
" call by value " 와 " call by reference " 의 차이점  (0) 2009.01.10
메뉴 항목 체크/ 해지 하기  (0) 2009.01.10
API 컨트롤 숨기기, 나타내기  (0) 2009.01.05
CWnd 클래스  (0) 2009.01.05
posted by 유돌이
prev 1 2 3 4 next