GSI

Google
 

테스트를 위해서 프로젝트를 생성한다.
응용 프로그램 종류를 단일 문서로 설정하고 기본 클래스는 CView로 설정합니다.
사용자 삽입 이미지

기본 프로젝트는 아래와 같습니다.
사용자 삽입 이미지

위의 응용 프로그램에 새로운 CView를 추가해 보겠습니다.
CDialog, CStatic 등의 컨트롤은 Create() 등의 함수를 통해서 생성하고 처리를 하게 되는데요.
CView는 Create()로 하게 되면 삭제 하는데 오류가 생기거나 안되더라구요.
그래서 CView는 아래의 코드와 같이 CCreateContext를 사용해서 처리 합니다.

CWnd* pFrameWnd = this;
CCreateContext pContext;
pContext.m_pCurrentDoc = new CDummyDoc();
pContext.m_pNewViewClass = RUNTIME_CLASS(CPixelMapView);
m_pPixelMapView = (CPixelMapView *) ((CFrameWnd*)pFrameWnd)->CreateView(&pContext);
ASSERT(m_pPixelMapView);
m_pPixelMapView->ShowWindow(SW_NORMAL);
m_pPixelMapView->MoveWindow( 20, 20, 100, 100 );

1. CDummyDoc 클래스를 생성합니다.
2. CPixelMapView 클래스를 생성합니다.
3. CInsertViewView 부모 클래스에 헤더를 선언합니다.
   - #include "DummyDoc.h"
   - #include "PixelMapView.h"
4. 클래스 내부에 View 접근을 위한 포인터 변수를 선언합니다.
   - CPixelMapView* m_pPixelMapView;
5. CPixelMapView 를 등록하기 위해서 OnCreate()를 선언합니다.

int CInsertViewView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 CWnd* pFrameWnd = this;
 CCreateContext pContext;
 pContext.m_pCurrentDoc = new CDummyDoc();
 pContext.m_pNewViewClass = RUNTIME_CLASS(CPixelMapView);
 m_pPixelMapView = (CPixelMapView *) ((CFrameWnd*)pFrameWnd)->CreateView(&pContext);
 ASSERT(m_pPixelMapView);
 m_pPixelMapView->ShowWindow(SW_NORMAL);
 m_pPixelMapView->MoveWindow( 20, 20, 100, 100 );

 return 0;
}

추가를 하고 나면 아래와 같이 화면이 나오게 됩니다.
사용자 삽입 이미지

이후 작업은 입맛에 맞게 ^^
Posted by gsi
:

 

1박 2일을 제 고향인 거창에서 찍었다네요 ^^..
왠지 모를 이 친근함 ^^..
Posted by gsi
:

Google
 

몇달 전부터 Scroll View 페이지를 응용한 개발툴을 몇개 작성을 하게 되었네요.
CView 보다 더 복잡하고, 스크롤이 들어 가면서 포지션 정보를 무시할 수 없더군요.

가장 귀찮게 여겨 지는 것은 Client Area 부분의 마우스가 Down, Up Move 등의 행위를 할때
항상 ScrollToPosition()을 달고 다녀야 한다는게 너무나 맘에 안들었습니다.

마우스의 위치 좌표가 왜 스크롤된 위치가 나오지 않고 현재 보이는 화면 영역의 상대 값이 나오는지.
정말 귀찮습니다.

그래서 CScrollView 클래스에 CView를 삽입 하고,
TotalSize 만큼 CView를 확장해서 처리를 하게 되었습니다.

스크롤 정보는 CSCrollView로 보내야 되고,
화면의 마우스 처리는 CView가 담당하게 처리 하였죠.

근데 .. 이렇게 하니 마우스의 좌표가 스크롤된후의 CView의 위치 정보가 보이게 되더군요.
참으로 편합니다. ^^ 그 위치가 스크롤된 화면 위치니까요.

조금더 나아지는 MFC 방법들이 재미나게 느껴 집니다.

요즘은 애매한 컨트롤은 CWnd, CStatic, CView, CDialog 등과 같은 컨트롤을
여러개 겹치면서 다양한 효과를 구현하고 있네요 ^^..

이번에 테스트뷰로 만들고 있는 화면입니다.
사용자 삽입 이미지

이 프로그램의 기능은 휠을 통한 좌우 스크롤 기능과 화면의 픽킹 처리가 CView에서 담당하는게 특징입니다.

배움에 있어서 여러가지 새로운 ms의 기술들과 플렉스 등을 보면서.
MFC의 기술 또한 같이 성장하는거 같습니다.

아.. 이제 자야 겠네요.. @.@.. 몽롱합니다.
Posted by gsi
:

몇주 전 부터 누가 짜놓은 패치 프로그램을 보고 있자니 너무 답답합니다.
물론 그 코드가 잘못되었다기 보다 Win32 의 C 스타일의 코드가 저에게는 너무나 하드 코딩 적이고,
가독성이 떨어지고, 코드 재사용성이 안보이기 때문이죠.

뭐.. 전역 변수가 많고, 코드 몇줄 추가 하면 어디서 모를 에러가 나오고,
XP, Vista 의 디파인된 다른 코드 들을 보면서,

몇 파트는 C#을 사용해서 작성도 하게 되었지요.

근데 레지스트리 등록이나 파일 삭제 등과 같이 여러가지 부분에서
.Net 베이스의 C# 에서는 다르게 짜주는게 별로 안보이는듯 합니다.

OS 별로 짜주어야 할까요?...
제가 잘못 알고 있는건지 궁금하네요..

하지만 가장 좋은건 코드가 간결해 지고 C++의 STL이 있으면서 편해지는거 처름
다양함과 간결함, 많은 메소드를 지원함에 있어서 C#의 매력에 푹 빠지네요 ^^.

이 참에 다 바꿔서 해봐야 할듯 한데..
조금 귀찮아 지기도 하네요 ^^
Posted by gsi
:

[C#] 디자이너 페이지 오류

C# 2008. 3. 20. 11:30 |

form.cs[디자인] 페이지가 아래와 같은 내용으로 표시 되면서 로드 되지 않는 오류가 가끔 있다.
사용자 삽입 이미지
이 내용은 결국 프로그램의 규칙을 알지 못하고 막 짜다 보니 생기게 된 에러입니다. -.-;
하지만 지금도 확실한 에러 내용은 모르겠고, 저 같은 경우는 다음과 같이 해결했습니다.

문제가 생긴 부분은 아래의 코드 부분입니다.
namespace AzitroUpdater
{
    public class UpdateInfo   <--- 여기 클래스가 위치 하면서 오류가 남
    {
        public string UrlHttpPath { get; set; }
        public string UrlDownloadFolder { get; set; }
        public string UrlDownloadFile { get; set; }
    }
    public partial class Form1 : Form
    {
        int curIndex = 0;
        ...................

위의 코드에서 알 수 있듯이 시작하는 클래스가 Form1 인데
그 위에 다른 클래스가 존재 해서 문제가 생기는 거였다.
이 코드를 다른 파일이나 다른 위치로 옮기니 되었다.
Posted by gsi
:

프로그램 짜다가 저장한 이미지를 확인 하기 위해서 탐색기에서 이미지를 읽기 보다는
해당 알씨와 같은 이미지 프로그램에 인자로 해당 파일을 자동으로 열리게 하는게 좋을때가 있다.
아래와 같이 하면 해당 실행 파일을 실행할 수 있다.

char szProgramName[MAX_PATH]= {0, };
wsprintf (szProgramName, "C:\\Program Files\\ESTsoft\\ALSee\\alsee d:\\aaa.bmp");
STARTUPINFO si = {0,};
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
si.dwFlags = 0;

CreateProcess (NULL,
      szProgramName,
      NULL,
      NULL,
      FALSE,
      0,
      NULL,
      NULL,
      &si,
      &pi);
Posted by gsi
:

[C#] - string.Split 사용법

C# 2008. 3. 13. 17:46 |

C++ 에서 C# 으로 읽어 들일때
char buf[128] 의 데이터를 아래와 같이 읽어 들일때.
buf1 = new string(br.ReadChars(128));
string [] split = buf1.Split(new Char [] {'\0'});
buf1 = split[0];

buf1 이 128로 읽어 들이면, 뒤에 \0 의 값이 쭉 저장되게 된다.
그렇게 하면  buf1 의 길이는 128이 된다. 즉, 필요 없는 공간이 생기게 마련이다.
(혹.. 이거 말고 다른 방법으로 읽을수 있다면 꼭 연락좀.. -.- )
그래서 \0 을 Split을 사용해서 나눈 다음에 필요한 정보만 가져 오도록 한다.

string [] split = buf1.Split(new Char [] {'\0'});
를 하고 나면 split 에 \0 으로 나누어진 데이터가 배열로 저장 된다.
이렇게 하고 나면 제일 앞쪽에 필요한 데이터만 모이게 된다.

buf1 = split[0] 을 해서 buf1 에 필요한 데이터만 담을 수 있다.
Posted by gsi
:

사용자 삽입 이미지

HTTP 프로토콜을 사용해서 원격파일 다운로드 프로그램 만들고 있습니다.

HTTP 를 통해서 파일을 받을때는 WebClient 를 사용하고 있다.
단순하게 다운로드 받기 위해서는 아래와 같이 DownloadFile()를 사용한다.

WebClient webclient = new WebClient();
webclient.DownloadFile(updatelistUrl, updatelistTxt);


그리고 다운로드 받는 상태를 알기 위해서는 DownloadFile 가 아닌 DownloadFileAsync 를 사용해야 한다.
그리고 받는 동안 호출되는 이벤트 함수와 다 받은후 처리 하는 함수를 등록해야 한다.

// 객체 생성
WebClient client = new WebClient();

// 이벤트 함수 등록
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);

// 받는 동안 프로그래스바의 Value에 추가한다. (퍼센트 값이 바로 제공된다.)
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    progressfile.Value = e.ProgressPercentage;
}
//
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{

}


파일을 실제로 다운로드 받을때는 아래와 같이 처리 합니다.
(DownloadFileAsync 이것을 사용해야 이벤트 함수가 호출 됩니다.)

client.DownloadFileAsync(new Uri(curFile.Url), curFile.Path);


스레드로 해도 될 듯 한데 우선 작업 하기 편하게 타이머를 사용해서 제작 하였습니다.
Test 버튼을 누르면 해당 동작이 시작 됩니다.


[동작 순서]

  1. Updatelist.txt 파일을 다운로드 한다.
  2. Updatelist.txt 파일의 정보를 분석해서 다운로드할 파일을 구성한다.
  3. 해당 파일을 타이머를 통해서 다 받을 때 까지 반복한다.
  4. 다 받으면 자동 종료 또는 특정 실행 파일을 실행한다.
Posted by gsi
:

디렉토리를 생성할때 디렉토리가 생성되어 있는지 검사도 해야 한다.

Directory 나 DirectoryInfo 를 사용하면 디렉토리 생성 및 검사도 가능하다.

방법#1

if (Directory.Exists(rootPath) == false)

    Directory.CreateDirectory(rootPath);

방법#2

DirectoryInfo di = new DirectoryInfo(rootPath);

if (di.Exists == false)

{

    di.Create();

}

Posted by gsi
:

Text File를 한줄 한줄 읽을때, 해당 문자를 기준으로 파서 할때 아래와 같이 하면 된다.
Regex는 다른 정규식도 표현할 수 있다고 하지만, @.@ 왠지 복잡하네요..

우선 단순하게 ";"를 기준으로 파서를 하는게 있어서 그 코드를 올려 봅니다.

static void ReadFromFile(string filename)
{
    StreamReader SR;
    string S;
    SR = File.OpenText(filename);
    S = SR.ReadLine();
    while (S != null)
    {
        Regex rx = new Regex(";");

        foreach (string ss in rx.Split(S))
        {
            Console.WriteLine(ss);
        }

        //Console.WriteLine(S);
        S = SR.ReadLine();
    }
    SR.Close();
}
Posted by gsi
:

C++ 에서 FILE 를 사용해서 데이터를 바이너리로 저장 했다면 C#에서 어떻게 읽어야 할까?.

C#을 배우는 상태에서 C++ 과의 파일 연동 문제가 고민이 되었다.
사실 모르니 궁금증이 생긴 거지만 몇가지 테스트를 하다 보니 바이너리 데이터는 BinaryReader 로 읽을수 있었다.

해당 파일을 읽을때 FileInfo를 사용해서 오픈 한 다음에 BinaryReader로 읽을 수 있다.
FileInfo fi = new FileInfo(@"D:\Testbinary.dat");
BinaryReader br = new BinaryReader(fi.OpenRead());

C++ 에서 아래 데이터를 저장했습니다.
FILE* fp = fopen(path, "wb");
int data0 = 100;
float data1 = 100.123f;
char buf0[128] = "son byoung uk";
fwrite(&data0, sizeof(int), 1, fp);
fwrite(buf0, 128, 1, fp);
fwrite(&data1, sizeof(float), 1, fp);
fclose(fp);

C# 에서 아래와 같이 데이터를 읽었습니다.
int data0;
float data1;
char[] buf0;
string buf1; data0 = br.ReadInt32();
buf0 = br.ReadChars(128);
buf1 = new string(buf0);
data1 = br.ReadSingle();

위의 내용을 아래와 같이 정리해봤습니다.

C++

C#

int

br.ReadInt32()

float

br.ReadSingle()

double

br.ReadDouble()

char[]

string a = new string(br.ReadChars(128))

Posted by gsi
:

[WPF] - Angle Gauge 데모

WPF Sample 2008. 3. 10. 18:03 |


사용자 삽입 이미지

Angle Gauge 를 표현해 봤습니다.
원형의 형태에서 AngleArc 같은걸 표현하지 못해서..
조금 다르게 표현해 봤네요.. -.-
Design 에서 그려서 Blend 를 통해서 표현해 봤어요.
TextBox 를 통해서 각도를 입력 받고, Start를 사용해서 에니메이션 구동..

UI만 이쁘게 꾸민다면.. 나름 이쁜 상태 표시용 게이지가 되겠네요.

관련 코드 :
Posted by gsi
:

사용자 삽입 이미지

Wpf Animation( Storyboard ) Demo

Xaml의 Storyboard를 추가 하고 cs 파일을 통해서 처리 해봤습니다.

- Button 을 누르면 해당 값을 설정하고 바로 에니메이션을 동작한다.
- SliderBar 을 누르면 해당 값을 설정하고 바로 에니메이션을 동작한다.

관련코드 :
Posted by gsi
:

사용자 삽입 이미지

Carousel 의 기본 구동 알로리즘을 사용해서 구현해본 예제 입니다.
버튼 컨트롤로 사용한 거지만, GDI+ 또는 Panel 등을 이용해서
처리 하면 깔끔하게 처리가 가능할 거 같습니다.

Posted by gsi
:

[C#] - GDImage - 좋은 데모

C# 2008. 3. 3. 16:34 |


C# .Net 의 GDI를 사용한 다양한 이미지 효과 데모를 제공하는 홈페이지

사용자 삽입 이미지

관련 홈페이지 주소 : http://www.zapsolution.com/winlift/ccorner.htm

Posted by gsi
: