티스토리 툴바

블로그 이미지

Passion of ComputerScience

Team Blog For Soft Engineering Team Project Manager : Park, Choi, Jeon Project Name : Linkube (Link + cube) "Passion is survival, not death." by cocy


'전체'에 해당되는 글 41건

  1. 2008/12/17 최종 발표 자료
  2. 2008/12/17 프로젝트 진행상황파악용 프로토타입 ver.1.0.3
  3. 2008/12/15 [api-스크랩] FindFirstFile
  4. 2008/12/12 [api-디렉토리탐색-스크랩]about). FindFirstFile(), FindNextFile(), FindClose()
  5. 2008/12/07 [스크랩 - WIN32 API ] 분할 윈도우 만들기
  6. 2008/12/07 [스크랩] Win32 API 비트맵 회전 함수 전체 소스 코드
  7. 2008/11/25 081125 SE Project Design
  8. 2008/11/24 4.1 외부파일의 논리적 구조, 4.2 공유 자료, 4.3 파일 접근 방법
  9. 2008/11/24 3.6 사용하는 파일, 3.7 호출하는 모듈
  10. 2008/11/23 3.4 오류메시지

최종 발표 자료

아슈ㅣ발
Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/53 관련글 쓰기

Top

프로젝트 진행상황파악용 프로토타입 ver.1.0.3


2008. 12. - 프로토타입 최종 마무리 
  캡션바를 활용한 정보전달
            디렉토리 탐색 추가

            텍스트 메뉴 저장기능 추가
            프로그램 안정성 확보

넘어온 오류
            이미지, 텍스트의 메뉴들은 아직 미구현
                      이미지, 텍스트의 경우 스크롤이 안생김
   인터넷 브라우저 활성화시 파일 드래그앤 드랍 오픈기능이 변질됨(익스플로러)
추가된 오류
볼륨 조절기능 작동 불가
            추가할 기능
            볼륨 조절기능
                     디렉토리를 열고 다음,이전파일 열기
            이미지파일 사이즈 조절
                      이미지 확장자 추가

2008. 11. 20. 목요일 - 기타 메뉴 수정
스크립트 메뉴 즐겨찾기 추가
            스크립트 파일 php확장자 추가 
 - php파일은 웹서버의 연동이 필요하므로, 차선책으로 대응.
            텍스트 메뉴 수정기능 추가. (저장은 아직 안됌.)

넘어온 오류
            이미지, 텍스트의 메뉴들은 아직 미구현
                        이미지, 텍스트의 경우 스크롤이 안생김
인터넷 브라우저 활성화시 파일 드래그앤 드랍 오픈기능이 변질됨(익스플로러)
추가된 오류
텍스트파일 열람시 널문자를 만나면 리드 종료
            추가할 기능
            볼륨 조절기능
                        디렉토리를 열고 다음,이전파일 열기
            이미지파일 사이즈 조절
                        이미지 확장자 추가

2008. 11. 12. 수요일 - 브라우저 메뉴 수정
뒤로, 앞으로 이동버튼 추가
            HELP 메뉴 수정, 단축키 메뉴얼 추가
            11.9일 두가지오류 수정

넘어온 오류
            이미지, 텍스트의 메뉴들은 아직 미구현
                        이미지, 텍스트의 경우 스크롤이 안생김
인터넷 브라우저 활성화시 파일 드래그앤 드랍 오픈기능이 변질됨(익스플로러)
추가된 오류
텍스트파일 열람시 널문자를 만나면 리드 종료
            추가할 기능
            볼륨 조절기능
                        디렉토리를 열고 다음,이전파일 열기
            이미지파일 사이즈 조절
                        이미지 확장자 추가

2008. 11. 09. 일요일 - Alpha test 시작.

파일 오픈, 클로즈 오류 수정
사운드 파일 확장자 추가
주소창 추가
동영상, 사운드파일 일시정지, 재생 추가
동영상, 사운드파일 이동바 추가
스크립트 메뉴에 특정 링크 추가(naver, daum)

오류
주소창이 한번에 뜨질않음(창 사이즈 조절하면 나타남) 수정
스크립트메뉴의 소스보기에서 인터넷링크된 페이지는 소스를 볼 수 없음.  해당기능제거
이미지, 텍스트의 메뉴들은 아직 미구현
이미지, 텍스트의 경우 스크롤이 안생김.
인터넷 브라우저 활성화시 파일 드래그앤 드랍 오픈기능이 변질됨(익스플로러)

열람 가능한 확장자
movie -> avi, wmv, mpg, mpeg
script -> htm, html
txt -> txt
image -> bmp
sound -> wav, wma, mp3

공통
동영상, 사운드파일의 경우 컴퓨터에 코덱이 설치되어있어야 재생이 가능하므로
통합 코덱 설치 파일도 함께 올립니다.

메뉴나 기능이 많이 부족하니 수정, 보완하겠습니다..
이건 샘플파일입니다. avi, wav, bmp, htm, txt


Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/26 관련글 쓰기

Top

[api-스크랩] FindFirstFile


Console과 API의 경우에는 FindFirstFile과 FindNextFile을 이용하실 수 있습니다.

FindFirstFile의 원형은 다음과 같습니다.

HANDLE FindFirstFile(
  LPCTSTR
lpFileName // pointer to name of file to search for
  LPWIN32_FIND_DATA lpFindFileData
                       // pointer to returned information
);

 

lpFileName : 파일 검색을 위한 파일 이름. "c\\*.*"또는 "c:\\*.txt" 같은 형식을 지정할 수 있다.

lpFindFileData : 파일 검색용 데이터 구조체다. 검색된 파일들의 정보가 담겨진다.

 

두번째로 FindNextFile의 원형은 다음과 같습니다.

 

BOOL FindNextFile(
  HANDLE hFindFile,
  LPWIN32_FIND_DATA lpFindFileData
);

hFindFile : FindFirstFile이 넘겨준 핸들을 넣는다. 실제 검색용 스레드가 돌고 있는 핸들이다.

lpFindFileData : 파일 검색용 구조체. FindFirstFile이 넘겨준 구조체를 주면 된다.

 

세번째로 그 파일의 정보를 담는 WIN32_FIND_DATA입니다.

 

typedef struct _WIN32_FIND_DATA {
  DWORD dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD nFileSizeHigh;
  DWORD nFileSizeLow;
  DWORD dwReserved0;
  DWORD dwReserved1;
  TCHAR cFileName[MAX_PATH];
  TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA,
*PWIN32_FIND_DATA;

 

 

위의 두 함수를 조합하여 사용 할 수 있습니다.

 

아래는 MSDN에서 제공하는 예제소스입니다.

 

#define _WIN32_WINNT 0x0501

#include <windows.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   char DirSpec[MAX_PATH];  // directory specification
   DWORD dwError;

   printf ("Target directory is %s.\n", argv[1]);
   strncpy (DirSpec, argv[1], strlen(argv[1])+1);
   strncat (DirSpec, "\\*", 3);

   hFind = FindFirstFile(DirSpec, &FindFileData);

   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("Invalid file handle. Error is %u\n", GetLastError());
      return (-1);
   } 
   else 
   {
      printf ("First file name is %s\n", FindFileData.cFileName);
      while (FindNextFile(hFind, &FindFileData) != 0) 
      {
         printf ("Next file name is %s\n", FindFileData.cFileName);
      }
    
      dwError = GetLastError();
      FindClose(hFind);
      if (dwError != ERROR_NO_MORE_FILES) 
      {
         printf ("FindNextFile error. Error is %u\n", dwError);
         return (-1);
      }
   }
   return (0);
}

소스는 간단합니다. FindFirstFile함수를 통해 디렉토리의 지정및 그 디렉토리의
가장 처음 파일을 찾습니다.
그후 FindNextFile을 통해 다음 파일들을 일일이 찾아서 검색조건에 일치한다면
TRUE를 리턴하는 것입니다.
WIN32_FIND_DATA 구조체에는 파일의 서치 정보가 들어있습니다. 파일의 속성및
파일이름, 생성날짜, 크기 등등 거의 모든 정보가 들어있습니다. 이를 활용하여
파일의 변경여부등도 파악이 가능합니다.
Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/51 관련글 쓰기

Top

[api-디렉토리탐색-스크랩]about). FindFirstFile(), FindNextFile(), FindClose()


FindFirstFile(), FindNextFile(), FindClose()
 
특정 디렉토리 아래에 있는 모든 파일과 서브 디렉토리 혹은 특정 조건의 파일과 서브 디렉토리를 얻을 때
사용하는 API함수
 
FindFirstFile()
 - 원형 : HANDLE FindFirstFile(LPCTSTR lpFileNameLPWIN32_FIND_DATA lpFindFileData);
 - 파라미터
   . lpFileName : 특정한 경로나 디렉토리 또는 (*) 또는 (?) 를 포함한 wildcard character 파일명을
                      지정할 수 있다.
   . lpFindFileData : WIN32_FIND_DATA 구조체에 찾은 파일 또는 서브 디렉토리의 정보를 담는다.
 - 리턴
   . 호출 성공 : search handle을 리턴
   . 호출 실패 : INVALID_HANDLE_VALUE를 리턴. 확장된 에러 정보를 얻기위해서 GetLastError()를 호출
 - 설명
   .파일 검색을 시작한다.
 
FindClose()
 - 원형 : BOOL FindClose( HANDLE hFindFile );
 - 파라미터
   . hFindFile : FindFirstFile()을 통해서 얻은 search 핸들
 - 설명 : FindFirstFile() 또는 FindFirstFileEx() 에 의해 얻은 파일 핸들을 닫는다.
 
FindNextFile()
 - 원형 : BOOL FindNextFile(HANDLE hFindFileLPWIN32_FIND_DATA lpFindFileData );
 - 파라미터
   . hFindFile : FindFirstFile() 또는 FindFirstFileEx() 에 의해 얻은 핸들
   . lpFindFileData : WIN32_FIND_DATA 구조체에 찾은 파일 또는 서브 디렉토리의 정보를 담는다.
 - 리턴
   . 호출 성공 : 0이 아닌 값을 리턴
   . 호출 실패 : 0을 리턴. 더 많은 에러 정보를 얻기 위해서 GetLastError() 호출
 - 설명
   .  다음 파일의 정보를 얻는다.
 
WIN32_FIND_DATA
 - FindFirstFile, FindFirstFileEx, FindNextFile 등의 함수로 얻은 정보를 담은 구조체.
 - 자세한 정보
 
GetLassError
 - 원형 : DWORD GetLastError(void);
 - 파라미터
   . 없음
 - 리턴
   . Calling Thread의 마지막 에러 코드를 리턴한다.
 - 설명 : Calling Thread의 마지막 에러를 받는다.
 - 자세한 정보
 
System Error Code
Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/49 관련글 쓰기

Top

[스크랩 - WIN32 API ] 분할 윈도우 만들기


WIN 32 API를 이용해서 분할윈도우를 만들고자 2일에 걸쳐서 인터넷를 뒤졌죠..

그러다가 어떤님 블로그에서 비슷한 예제를 발견했네요. 하지만; 실행이 안되더군요..ㅠ_ㅠ

그래도 그걸 참고삼아서 이러저리 짜집기를 해놓았드니 돌아가드라구요.. 넘 어렵게 찾아서 팁으로 올려봅니다.

아무쪼록 도움이 되는 분들이 있기를^^   시작합니다.

 

===================================================================================================================

저는 VC2005를 사용합니다. 그걸 위주로 설명할께요.

 

먼저 프로젝트를 생성합니다.  WIN32 Project의 Windows Application 스타일로 만들면 됩니다.

프로젝트가 생성이 되면 기본적인 stdafx파일과 메인윈도우가 자동으로 생성이 됩니다.^^

 

그러면 만들어진 자동생성 코드에 보면

 

 ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

<----브러쉬 관련 코드 넣기----->

 wcex.cbSize = sizeof(WNDCLASSEX);

 wcex.style   = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc = WndProc;
 wcex.cbClsExtra  = 0;
 wcex.cbWndExtra  = 0;
 wcex.hInstance  = hInstance;
 wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST2));
 wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST2);
 wcex.lpszClassName = szWindowClass;
 wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

 

<----분할 윈도우 관련 코드 넣기----->

 

return RegisterClassEx(&wcex);

}

 

클래스가 있습니다. 위와 같은 형태입니다. 위의 클래스에 분할될 윈도우에 관한 설정을 추가해 줘야 합니다.

위의 코드에서 <브러쉬 관련 코드넣기 >부분에 아래 코드를 추가합니다. 분할된 윈도우에 색을 넣어주기 위해서 입니다. 그래야 눈에 잘 띄어서 제대로 들어갓는지 확인하기가 편하거든요.

 

static HBRUSH hRedBrush,  hBlueBrush,  hGreenBrush;
 hRedBrush=CreateSolidBrush(RGB(255,0,0));
 hGreenBrush=CreateSolidBrush(RGB(0,255,0));
 hBlueBrush=CreateSolidBrush(RGB(0,0,255));

 

 다음으로 아래의 <분할 윈도우 관련 코드 넣기> 부분에 아래 코드를 삽입합니다.

hbrBcakground 는 윈도우에 색을 넣는 부분입니다. 빨랑, 초록, 파랑 순으로 넣을겁니다.

lpfnWndProc 는 윈도우 프로시저를 링크합니다. 메시지들을 받기 위해서죠.

lpszClassName 는 클래스의 이름을 넣는 부분입니다.

 

wcex.hbrBackground = hRedBrush;
wcex.lpfnWndProc = ChildLeftProc;
wcex.lpszClassName = "ChildLeft";
RegisterClassEx(&wcex);

 

wcex.hbrBackground = hGreenBrush;
 wcex.lpfnWndProc = ChildTopProc;
 wcex.lpszClassName = "ChildTop";
 RegisterClassEx(&wcex);

 

 wcex.hbrBackground = hBlueBrush;
 wcex.lpfnWndProc = ChildBottomProc;
 wcex.lpszClassName = "ChildBottom";

 

 

 

자 그럼 MyRegisterClass() 함수에 관해서는 끝났습니다.

다음으로 위에 ChildLeftProc, ChildTopProc, ChildBottomPorc 클래스가 없습니다. 이부분은

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

클래스를 복사하셔서 적당하게 만드시기 바랍니다. 위에 선언해 주시는 것도 잊지 마시고요.

 

 

그럼 이제 윈도우 생성함수를 만들어야 됩니다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

 이 프로시저 함수 안에 만들겁니다.

 

case WM_CREATE:
  hC1 = CreateWindow("ChildLeft", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|, 0, 0, 0, 0, hWnd, 0, hInst, NULL);  
  hC2 = CreateWindow("ChildTop", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);

  hC3 = CreateWindow("ChildBottom", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);

break;

 

switch문 안에 위의 코드를 삽입합니다. 윈도우를 생성하는 함수입니다. 3개의 윈도우로 나눌것이기 때문에 3개를 만들었습니다. 주의할 점은 먼 처음 인자에 "ChildLeft"부분을 위에서 클래스이름과 동일하게 해야 된다는 점입니다.

 

다음으로 3개의 윈도우의 위치를 설정합니다. MoveWindow()를 사용합니다. 코드는 아래와 같습니다.

 

case WM_SIZE:
  if(wParam != SIZE_MINIMIZED)
  {
   GetClientRect(hWnd, &rect);
   MoveWindow(hC1, 0, 0, 300, 300, TRUE);
   MoveWindow(hC2, 300, 0, rect.right-300, 300, TRUE);
   MoveWindow(hC3, 0, 300, rect.right, rect.bottom, TRUE);
  }
  break;

 

 

 실행하면 아래와 같이 됩니다.

 

 

 

 



// TEST2.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "TEST2.h"

#define MAX_LOADSTRING 100

 

//윈도우 핸들 추가

HWND hC1, hC2, hC3;


// Global Variables:
HINSTANCE hInst;        // current instance
TCHAR szTitle[MAX_LOADSTRING];     // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];   // the main window class name

// Forward declarations of functions included in this code module:
ATOM    MyRegisterClass(HINSTANCE hInstance);
BOOL    InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

 

//윈도우 프로시저 추가

LRESULT CALLBACK ChildLeftProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildTopProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildBottomProc(HWND,UINT,WPARAM,LPARAM
);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 UNREFERENCED_PARAMETER(hPrevInstance);
 UNREFERENCED_PARAMETER(lpCmdLine);

  // TODO: Place code here.
 MSG msg;
 HACCEL hAccelTable;

 // Initialize global strings
 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 LoadString(hInstance, IDC_TEST2, szWindowClass, MAX_LOADSTRING);
 MyRegisterClass(hInstance);

 // Perform application initialization:
 if (!InitInstance (hInstance, nCmdShow))
 {
  return FALSE;
 }

 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST2));

 // Main message loop:
 while (GetMessage(&msg, NULL, 0, 0))
 {
  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }

 return (int) msg.wParam;
}

 

//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
 WNDCLASSEX wcex;

//브러시 추가
 static HBRUSH hRedBrush,hBlueBrush,hGreenBrush;
 hRedBrush=CreateSolidBrush(RGB(255,0,0));
 hGreenBrush=CreateSolidBrush(RGB(0,255,0));
 hBlueBrush=CreateSolidBrush(RGB(0,0,255));


 wcex.cbSize = sizeof(WNDCLASSEX);

 wcex.style   = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc = WndProc;
 wcex.cbClsExtra  = 0;
 wcex.cbWndExtra  = 0;
 wcex.hInstance  = hInstance;
 wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST2));
 wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST2);
 wcex.lpszClassName = szWindowClass;
 wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

 RegisterClassEx(&wcex);

 

//윈도우 클래스 설정

 wcex.hbrBackground = hRedBrush;
 wcex.lpfnWndProc = ChildLeftProc;
 wcex.lpszClassName = "ChildLeft";
 RegisterClassEx(&wcex);

 

 wcex.hbrBackground = hGreenBrush;
 wcex.lpfnWndProc = ChildTopProc;
 wcex.lpszClassName = "ChildTop";
 RegisterClassEx(&wcex);

 

 wcex.hbrBackground = hBlueBrush;
 wcex.lpfnWndProc = ChildBottomProc;
 wcex.lpszClassName = "ChildBottom";

 

 return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HINSTANCE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

 

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND - process the application menu
//  WM_PAINT - Paint the main window
//  WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 int wmId, wmEvent;
 PAINTSTRUCT ps;
 HDC hdc;
 RECT rect;

 switch (message)
 {
 case WM_COMMAND:
  wmId    = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // Parse the menu selections:
  switch (wmId)
  {
  case IDM_ABOUT:
   DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
   break;
  case IDM_EXIT:
   DestroyWindow(hWnd);
   break;
  default:
   return DefWindowProc(hWnd, message, wParam, lParam);
  }
  break;
 case WM_CREATE:

 

//윈도우 생성
  hC1 = CreateWindow("ChildLeft", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);  
  hC2 = CreateWindow("ChildTop", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);
  hC3 = CreateWindow("ChildBottom", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);
  
  
  break;
 case WM_SIZE:

//윈도우 위치, 사이즈 조정
  if(wParam != SIZE_MINIMIZED)
  {
   GetClientRect(hWnd, &rect);
   MoveWindow(hC1, 0, 0, 300, 300, TRUE);
   MoveWindow(hC2, 300, 0, rect.right-300, 300, TRUE);
   MoveWindow(hC3, 0, 300, rect.right, rect.bottom, TRUE);
  }

  break;
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  // TODO: Add any drawing code here...
  EndPaint(hWnd, &ps);
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
}


// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
 UNREFERENCED_PARAMETER(lParam);
 switch (message)
 {
 case WM_INITDIALOG:
  return (INT_PTR)TRUE;
 
 case WM_COMMAND:
  if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  {
   EndDialog(hDlg, LOWORD(wParam));
   return (INT_PTR)TRUE;
  }
  break;
 }
 return (INT_PTR)FALSE;
}


LRESULT CALLBACK ChildLeftProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 int wmId, wmEvent;
 PAINTSTRUCT ps;
 HDC hdc;

 switch (message)
 {
 case WM_COMMAND:
  wmId    = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // Parse the menu selections:
  
  break;
 
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  // TODO: Add any drawing code here...
  EndPaint(hWnd, &ps);
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
}


LRESULT CALLBACK ChildTopProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 int wmId, wmEvent;
 PAINTSTRUCT ps;
 HDC hdc;

 switch (message)
 {
 case WM_COMMAND:
  wmId    = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // Parse the menu selections:
  
  break; 
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  // TODO: Add any drawing code here...
  EndPaint(hWnd, &ps);
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
}


LRESULT CALLBACK ChildBottomProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 int wmId, wmEvent;
 PAINTSTRUCT ps;
 HDC hdc;

 switch (message)
 {
 case WM_COMMAND:
  wmId    = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // Parse the menu selections:
  
  break;
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  // TODO: Add any drawing code here...
  EndPaint(hWnd, &ps);
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;
}

Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/48 관련글 쓰기

Top

[스크랩] Win32 API 비트맵 회전 함수 전체 소스 코드


  1. #include <windows.h>   
  2. #include <math.h>   
  3.   
  4. #define PI          3.141592654   
  5.   
  6. // 인수목록   
  7. // HDC      hdc         :   
  8. // HBITMAP  hBitmap     :   
  9. // int      source_x    : 회전 이미지 비트맵에서의, 출력할 사각영역의 좌상단x좌표.   
  10. // int      source_y    : 회전 이미지 비트맵에서의, 출력할 사각영역의 좌상단y좌표.   
  11. // int      dest_width  : 회전할 비트맵 이미지의 폭   크기 == 회전할 비트맵 이미지가 출력될 폭 크기   
  12. // int      dest_heigjt : 회전할 비트맵 이미지의 높이 크기 == 회전할 비트맵 이미지가 출력될 높이 크기   
  13. // float    angle       : 회전할 각도.   
  14. // COLORREF bkColor     : 회전후 생긴 공백영역을 칠할 색상. 이미지 사각형을 회전하면, 공백영역이 생깁니다. (예)다이아몬드 형태로 회전된 사각형에서의 뒤부분 영역   
  15. //                        그 공백영역을 미리 채울 색상을 지정합니다.   
  16.   
  17. HBITMAP GetRotatedBitmap( HDC hdc, HBITMAP hBitmap, int source_x, int source_y,   
  18.                           int dest_width, int dest_height, float angle, COLORREF bkColor )   
  19. {     
  20.     HDC sourceDC        = CreateCompatibleDC(hdc);                                      // 회전할 비트맵 원본을 선택할 DC   
  21.     HDC destDC          = CreateCompatibleDC(hdc);                                      // 회전할 비트맵을 출력받을 DC   
  22.     HBITMAP hbmResult   = CreateCompatibleBitmap( hdc, dest_width, dest_height );       // 회전할 비트맵을 출력받을 메모리비트맵 핸들   
  23.   
  24.     HBITMAP hbmOldSource= (HBITMAP)SelectObject( sourceDC, hBitmap );                   // 회전할 비트맵 원본을 DC에 선택   
  25.     HBITMAP hbmOldDest  = (HBITMAP)SelectObject( destDC, hbmResult );                   // 회전할 비트맵을 출력받을 DC에, 회전할 비트맵을 출력받을 메모리비트맵 선택   
  26.   
  27.     HBRUSH hbrBack      = CreateSolidBrush( bkColor );                                  // 회전으로 인한, 공백영역을 칠할 브러시핸들 생성   
  28.     HBRUSH hbrOld       = (HBRUSH)SelectObject( destDC, hbrBack );                      // 브러시핸들 선택   
  29.     PatBlt( destDC, 0, 0, dest_width, dest_height, PATCOPY );                           // 선택된 브러시로, 회전할 비트맵을 출력받을 DC에, 미리 색상을 채워 지움   
  30.     DeleteObject( SelectObject( destDC, hbrOld ) );                                     // 브러시 해제   
  31.   
  32.     angle           = (float)( angle * PI / 180 );                                      // 회전할 각도(360분법)를, 라디안단위의 각도로 변경   
  33.     float cosine    = (float)cos( angle );                                              // 회전이동변환 행렬에 들어갈 cos세타 값을 구함          
  34.     float sine      = (float)sin( angle );                                              // 회전이동변환 행렬에 들어갈 sin세타 값을 구함   
  35.   
  36.     SetGraphicsMode(destDC, GM_ADVANCED);                                               // 윈도우 좌표계의 회전을 위하여, 그래픽모드를 확장모드로 변경합니다.(요구사항:윈98,NT이상)   
  37.   
  38.     // 회전이동변환 행렬을 정의.   
  39.     // (윈도우즈 API정복 개정판 2권 Page(1279) 참조.)   
  40.     // (게임 프로그래머를 위한 기초수학과 물리 Page(196) 참조.)   
  41.   
  42.     XFORM xform;                                                                        // 방정식을 표현하는 3행3열의 행렬 선언   
  43.     xform.eM11 = cosine;                                                                // 1행 1열 성분 설정 (회전성분)   
  44.     xform.eM12 = sine;                                                                  // 1행 2열 성분 설정 (회전성분)   
  45.     xform.eM21 = -sine;                                                                 // 2행 1열 성분 설정 (회전성분)   
  46.     xform.eM22 = cosine;                                                                // 2행 2열 성분 설정 (회전성분)   
  47.     xform.eDx = (FLOAT)dest_width / 2.0f;                                               // 3행 1열 성분 설정 (X축 이동 성분)   
  48.     xform.eDy = (FLOAT)dest_height / 2.0f;                                              // 3행 2열 성분 설정 (Y축 이동 성분)   
  49.   
  50.     // 설정한 행렬로, 인수DC의 윈도우즈 좌표계를 변환.   
  51.     // 인수DC는 출력대상으로 메모리비트맵을 가지므로,   
  52.     // 선택하고 있는 메모리비트맵의 좌표체계가 회전된다.   
  53.   
  54.     SetWorldTransform( destDC, &xform );   
  55.   
  56.     // 회전된 메모리DC에, 회전할 이미지를 출력   
  57.   
  58.     BitBlt(destDC, -(dest_width/2),-(dest_height/2), dest_width, dest_height, sourceDC, source_x, source_y, SRCCOPY );    
  59.   
  60.     // 사용된 자원 해제   
  61.   
  62.     SelectObject( sourceDC, hbmOldSource );    
  63.     SelectObject( destDC, hbmOldDest );    
  64.     DeleteObject(sourceDC);   
  65.     DeleteObject(destDC);   
  66.   
  67.     // 회전된 비트맵 핸들 리턴   
  68.   
  69.     return hbmResult;    
  70. }   
  71.   
  72. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
  73. // 인수 목록   
  74. // HDC      hdc         : 화면DC의 핸들. GetRotatedBitmap()함수의 인자로 전달하게 됩니다.   
  75. // HDC      hOffScreen  : 회전 이미지를 출력할, 오프스크린DC의 핸들.   
  76. // int      dest_x      : 오프스크린 상에서, 회전 이미지가 출력될 x좌표.   
  77. // int      dest_y      : 오프스크린 상에서, 회전 이미지가 출력될 y좌표.   
  78. // int      dest_width  : 회전할 비트맵 이미지의 폭   크기 == 회전할 비트맵 이미지가 출력될 폭 크기   
  79. // int      dest_heigjt : 회전할 비트맵 이미지의 높이 크기 == 회전할 비트맵 이미지가 출력될 높이 크기   
  80. // HBITMAP  hBit        : 회전 이미지 비트맵핸들   
  81. // int      source_x    : 회전 이미지 비트맵에서의, 출력할 사각영역의 좌상단x좌표.   
  82. // int      source_y    : 회전 이미지 비트맵에서의, 출력할 사각영역의 좌상단y좌표.   
  83. // DWORD    dFlag       : ROP모드를 나타내는 플래그 매크로   
  84. // float    angle       : 회전할 각도.   
  85. // COLORREF bkColor     : 회전후 생긴 공백영역을 칠할 색상. 이미지 사각형을 회전하면, 공백영역이 생깁니다. (예)다이아몬드 형태로 회전된 사각형에서의 뒤부분 영역   
  86. //   
  87. void RotateBlt( HDC hdc, HDC hOffScreen, int dest_x, int dest_y, int dest_width, int dest_height,   
  88.                 HBITMAP hBit, int source_x, int source_y, DWORD dFlag, float angle, COLORREF bkColor )   
  89. {   
  90.     static HDC hTempMemDC;              // 회전한 비트맵을 선택할 메모리DC   
  91.     HBITMAP hTempBitmap, hOldBitmap;    // 회전한 비트맵을 저장할, 비트맵 핸들   
  92.   
  93.     // 최초 한번만 비트맵DC를 생성합니다.   
  94.   
  95.     if( !hTempMemDC ) hTempMemDC = CreateCompatibleDC( hdc );   
  96.   
  97.     // 비트맵을 회전하는 함수를 호출하여, 리턴되는 회전된 비트맵 핸들을 저장   
  98.   
  99.     hTempBitmap = GetRotatedBitmap( hdc, hBit, source_x, source_y, dest_width, dest_height, angle, bkColor );   
  100.   
  101.     // 회전된 비트맵 핸들을 선택하고,   
  102.   
  103.     hOldBitmap = (HBITMAP)SelectObject( hTempMemDC, hTempBitmap );   
  104.   
  105.     // 오프스크린DC에, 회전된 비트맵 핸들을 선택한, 메모리DC의 이미지를 출력합니다.   
  106.     // 안의 주석을 해제하면, 출력좌표를 중심으로 하는 회전이미지가 됩니다.   
  107.   
  108.     BitBlt( hOffScreen, dest_x/* - dest_width/2*/, dest_y/* - dest_height/2*/, dest_width, dest_height,   
  109.             hTempMemDC, 0, 0, dFlag );   
  110.   
  111.     SelectObject( hTempMemDC, hOldBitmap );   
  112.     DeleteObject( hTempBitmap );   
  113. }   
  114.   
  115. HWND    hWndMain;                   // 윈도우 핸들   
  116. HDC     hdc;                        // 화면         DC 핸들   
  117. HDC     hOffScreenDC;               // 오프스크린 DC 핸들   
  118. HBITMAP hOffScreenBitmap;           // 오프스크린 DC 가 선택하는, 메모리 비트맵 핸들   
  119. HBITMAP hMemBitmap;                 // 이미지를 담을, 메모리 비트맵 핸들   
  120.   
  121. void OnTimer();                     // WM_TIMER메세지의, 핸들러 함수   
  122.   
  123. LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )   
  124. {   
  125.     switch( message )   
  126.     {   
  127.         case WM_CREATE:   
  128.             hWndMain = hWnd;   
  129.             // 화면DC, 오프스크린DC, 오프스크린의 메모리비트맵을 미리 생성합니다.   
  130.   
  131.             hdc = GetDC( hWnd );   
  132.             hOffScreenDC = CreateCompatibleDC( hdc );   
  133.             hOffScreenBitmap = CreateCompatibleBitmap( hdc, 800, 600 );   
  134.             SelectObject( hOffScreenDC, hOffScreenBitmap );   
  135.             PatBlt( hOffScreenDC, 0, 0, 800, 600, WHITENESS );   
  136.   
  137.             // 이미지를 비트맵에 로드합니다.   
  138.   
  139.             hMemBitmap = (HBITMAP)LoadImage( GetModuleHandle(NULL),   
  140.                                              TEXT("player_walk.bmp"),   
  141.                                              IMAGE_BITMAP,   
  142.                                              0,   
  143.                                              0,   
  144.                                              LR_DEFAULTSIZE | LR_LOADFROMFILE );   
  145.   
  146.             // 타이머 생성   
  147.   
  148.             SetTimer( hWnd, 1, 20, NULL );   
  149.             break;   
  150.   
  151.         case WM_TIMER:   
  152.             OnTimer();   
  153.             break;   
  154.   
  155.         case WM_DESTROY:   
  156.             // 사용된 메모리 비트맵과, 오프스크린 DC, 타이머를 해제합니다.   
  157.             DeleteObject( hMemBitmap );   
  158.             DeleteObject( hOffScreenBitmap );   
  159.             DeleteDC( hOffScreenDC );   
  160.             KillTimer( hWnd, 1 );   
  161.             PostQuitMessage(0);   
  162.             break;   
  163.     }   
  164.   
  165.     return DefWindowProc( hWnd, message, wParam, lParam );   
  166. }   
  167.   
  168. void OnTimer()   
  169. {   
  170.     // 비트맵을 회전시킬 각도(360분법) 갱신   
  171.   
  172.     static FLOAT angle  = 0.0f;   
  173.     static BOOL bRotate = FALSE;   
  174.   
  175.     if( GetKeyState( VK_LBUTTON ) & 0x8000 ) { bRotate = TRUE; }   
  176.   
  177.     if( bRotate )   
  178.     {   
  179.         angle += 5.0f;   
  180.         if( angle >= 360.0f )   
  181.         {   
  182.             bRotate = FALSE;   
  183.             angle = 0.0f;   
  184.         }   
  185.     }   
  186.   
  187.     // 오프스크린DC의 이미지를, 하얀색으로 채워, 이전 프레임에서의 이미지를 삭제합니다.   
  188.   
  189.     PatBlt( hOffScreenDC, 0, 0, 800, 600, WHITENESS );   
  190.   
  191.     // 오프스크린DC에, 이미지의 마스크를 출력합니다.   
  192.   
  193.     RECT Rt;   
  194.     GetClientRect( hWndMain, &Rt );   
  195.     RotateBlt( hdc, hOffScreenDC, Rt.right / 2, Rt.bottom / 2, 59, 59,   
  196.                hMemBitmap, 0, 0, SRCAND, angle, RGB( 255, 255, 255 ) );   
  197.   
  198.     // 오프스크린DC에, 이미지를 출력합니다.   
  199.   
  200.     RotateBlt( hdc, hOffScreenDC, Rt.right / 2, Rt.bottom / 2, 59, 59,   
  201.                hMemBitmap, 60, 0, SRCPAINT, angle, RGB( 0, 0, 0 ) );   
  202.   
  203.     // 화면DC에, 오프스크린의 이미지를 출력합니다.   
  204.   
  205.     BitBlt( hdc, 0, 0, 800, 600, hOffScreenDC, 0, 0, SRCCOPY );   
  206. }  

    출처 : http://mumbi.net/216
Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/47 관련글 쓰기

Top

081125 SE Project Design

'08.11.25. 소프트웨어 공학 프로젝트 설계 부분 발표 및 제출 자료


Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/45 관련글 쓰기

Top

4.1 외부파일의 논리적 구조, 4.2 공유 자료, 4.3 파일 접근 방법

4.1 외부파일의 논리적 구조

프로그램 특성상, 특정한 db를 참조하거나 외부파일의 참조, 저장등은 필요치 않다.
하지만 사용자가 여는 파일은 존재하는데,
이 파일들은 특정한 논리구조를 갖추고 있지는 않고, 종류는 다음과 같다.


(그림3.4.5 - Message)


4.2 공유자료

매번 언급하는 사항이지만 특정 데이터를 다루는 프로그램이 아니므로,
특별히 공유되는 자료는 존재하지 않는다.
다만, 열람되고 있는 파일은 삭제될 수 있으며, 다른프로그램에서 읽을 수도 있다.
파일이 열려있는 상태에서 해당파일이 삭제되더라도,
프로그램내의 버프메모리에 남아있게되므로, 여전히 파일의 열람은 가능하다.

4.3 파일 접근 방법(데이터 베이스 관리 체제)

매번 계속 언급하지만, 관리하는 데이터베이스는 없습니다!
Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/42 관련글 쓰기

Top

3.6 사용하는 파일, 3.7 호출하는 모듈


3.6 사용하는 파일

프로그램 특성상 특정 사용자파일을 사용하는것이 아니라서
사용하는 파일이라기보다 사용되는 파일은
(그림3.4.5 - Message)를 참고하시기 바랍니다.

3.7 호출하는 모듈

직접 코딩한 모듈에서 호출하는 모듈은
LoadFile(MOV, SND, TXT...)에서 CloseFile(MOV, SND, TXT...)를 호출하는 정도이고,

그 이외에 API의 함수의 사용시 각 필요 함수들을 호출합니다.

#include "StdAfx.h"  // HTM, HTML
#include "mmsystem.h" // Media Control Interface
#include "resource.h" // Icon, Accelerator, Menu, etc...
#include <windows.h> // win32 api
#include <vfw.h>  // AVI
표 3.7.1 사용한 외부 모듈

소스의 각 모듈은 응집력은 강하나  
결합력은 약하므로 메인에서 이를 호출하여 결합력을 보완합니다.
Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/41 관련글 쓰기

Top

3.4 오류메시지




(그림3.4.1 - Error1)


(그림3.4.2 - Error2)


(그림3.4.3 - Error3)


(그림3.4.4 - Warning1)


(그림3.4.5 - Message)

다음은 프로그램내에서 출력되는 오류메세지들의 예입니다.
그림3.4.1~3.4.3까지는 열리지않은 파일의 메뉴를 호출했을경우 나타나는 오류메세지이며,
그림3.4.4는 경고메세지
그림3.4.5는 메세지박스로 사용자에게 해당정보를 알려줍니다.
Comment 0 Trackback 0

Trackback : http://sepoc.tistory.com/trackback/40 관련글 쓰기

Top

prev 1 2 3 4 5 next