UserControl 클래스를 추가 해서 사용해야 합니다. 즉, userControl 의 dll 파일을 참조 추가 해서 사용해야 한다는 말이죠.
WPF 에서 Win Form의 UserControl의 객체를 접근하기 위해서는 노출이 되어 있지 않기 때문에 게터 메소드를 하나 만들어서 해야 합니다. 예) public string TextValue { get { return textBox1.Text; } }
위의 게터 메소드가 노출되어 있다면 아래와 같이 WPF를 통해서 값을 참조할 수 있네요. 예) WindowsFormsControlLibrary1.UserControl1 uc = (WindowsFormsControlLibrary1.UserControl1)windowsFormsHost1.Child; textBox1.Text = uc.TextValue;
다른 몇가지 사항에 대해서는 더 테스트를 해보지 않았습니다. 우선 자세한 코드는 아래 파일을 보세요. 더 자세한 사항이나 기타 의논하고 싶으신 부분 있으시면 언제든 연락 부탁 해요.
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 인데 그 위에 다른 클래스가 존재 해서 문제가 생기는 거였다. 이 코드를 다른 파일이나 다른 위치로 옮기니 되었다.
buf1 이 128로 읽어 들이면, 뒤에 \0 의 값이 쭉 저장되게 된다. 그렇게 하면 buf1 의 길이는 128이 된다. 즉, 필요 없는 공간이 생기게 마련이다. (혹.. 이거 말고 다른 방법으로 읽을수 있다면 꼭 연락좀.. -.- ) 그래서 \0 을 Split을 사용해서 나눈 다음에 필요한 정보만 가져 오도록 한다.
string [] split = buf1.Split(new Char [] {'\0'}); 를 하고 나면 split 에 \0 으로 나누어진 데이터가 배열로 저장 된다. 이렇게 하고 나면 제일 앞쪽에 필요한 데이터만 모이게 된다.
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 이것을 사용해야 이벤트 함수가 호출 됩니다.)
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(); }
Carousel 의 기본 구동 알로리즘을 사용해서 구현해본 예제 입니다. 버튼 컨트롤로 사용한 거지만, GDI+ 또는 Panel 등을 이용해서 처리 하면 깔끔하게 처리가 가능할 거 같습니다.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace GsiCarousel { public partial class Form1 : Form { static Single[] SpriteAngle = new Single[10]; const double PiDiv180 = 1.74532925199433E-2; static int[] Zorder = new int[10]; static int[] FaceOrder = new int[10]; static Button[] ButtonList = new Button[10];
public Form1() { InitializeComponent(); LoadInfo(); }
private void LoadInfo() { int AngleStep = 0; int UboundSpriteData = 10; int StepAngle = (int)(360 / UboundSpriteData);
for (int K = 0; K < UboundSpriteData; K++) { SpriteAngle[K] = AngleStep;
Win32 대화 상자와 Windows 폼이 다른 점은 폼이 자동으로 사용자가 Enter, Esc 키가 눌렀을때 키보드 입력을 라우팅 하지 않는 다는데 있다. MFC와 같은 Win32 작업을 할때는 폼을 하나 생성하게 되면 Ok, Cancel 버튼이 생성되게 된다. 하지만 Windows 폼의 경우는 아무것도 생성되지 않는 윈도우만 생성된다. 이때 폼에 OK, Cancel 버튼을 넣어 주고 싶다면, 어떻게 해야 하는가? 이때 위의 이미지에 나오듯이 해당 버튼을 만들고 DialogResult의 속성을 정의해 주면 된다. 더 펀한듯 보인다.
C# 프로그램을 하다 보면 int 또는 Int32 라는걸 사용해서 타입을 정해줄 때가 있다. 처음에는 int 형이 있는데 Int32, Int64, int16 과 같은 걸 볼 수 있다. 지금 생각 해보면 int 는 C# 의 미리 정의된 타입이고, Int32 와 같이 int가 대문자 Int로 되는 것은 System을 네임스페이스로 가지는 .Net 의 미리 정의된 타입인거 같다.
몇가지 예)
bool
System.Boolean
True 인지 false 인지 나타내는 논리 값
기본값은 false 이다.
byte
System.Byte
0 부터 255 까지의 값을 저장하는 부호 없는 바이트, 기본값은 0 이다.
sbyte
System.SByte
-128 ~ 127 까지 저장하는 바이트, 기본값은 0이다.
char
System.Char
부호없는 16비트 유니코드 문자, 기본값은 ‘\0’ 이다.
decimal
System.Decimal
128 비트 데이터 형식, 재무 및 통화 계산에 적합하다. 기본값은 0.0m 이다.
double
System.Double
64비트 부동 소수점, 기본값은 0.0d 이다.
float
System.Single
32비트 부동 소수점, 기본값은 0.0f 이다.
int
System.Int32
부호 있는 32비트 정수 타입, 기본값은 0 이다.
uint
System.UInt32
부로 없는 32비트 정수 타입, 기본값은 0이다.
나머지는.. -.- 귀찮네욤. ^^
여기서 중요한건 C#으로 개발하는 사람은 C#의 타입을 사용해서 프로그램을 작성하는게 보다 명확하며, 다른 언어를 사용하는 컴포넌트 개발자와 함께 작업하는 경우에는 언어 사이의 타입을 일치시키기 위해서 반드시 위의 표와 같은 타입을 알고 있어야 한다.