秀丸やサクラエディタのように、ソースなどを色分けして表示するエディタを作りたいのですが、どうすればよいのでしょうか?
どなたかよろしくお願いします。
リッチテキストを使うとお手軽に出来そうですが、あまりお勧めできません。
ああいうエディタは、エディットコントロールを使わずに、全て自力でテキストを描画しています。
サクラエディタならソースが公開されていますから、見てみてはいかが?
わかりました。
がんっばて作成してみます。
解決を押してしまった後ですいません。
自分なりに考えてみましたが、Windowクラスの登録(RegisterClass)のところで失敗するようです。
原因がわからないのですが、どなたか助けてください。
RegisterClassの失敗した原因はなんですか?
GetLastErrorはなんで失敗したと言っているのですか?
え?それは何ですか?すいませんが詳しく教えてください。
> え?それは何ですか?
質問する前に、多少なりともご自分で調べられましたか?
Google(http://www.google.co.jp/)で「GetLastError」を検索すれば、いくらでも資料は見つかると思いますが。
シャノンさん、すいません。そのとおりでした。
そこでこのようなコードを書いてみると、
DWORD x;
char *y;
x=GetLastError();
wsprintf(y,"%d",x);
MessageBox(NULL,y,"Debug",MB_OK);
すいません。結果を書き忘れていました。
2 と書かれたメッセージが出てきました。
FormatMessage()によると”指定されたファイルが見つかりません”だそうですが、いったい何のことでしょう?
本題から外れますが
> DWORD x;
> char *y;
> x=GetLastError();
> wsprintf(y,"%d",x);
> MessageBox(NULL,y,"Debug",MB_OK);
これはマズいです。
どうマズいかは、このスレでは追求しないことにしましょう。
> FormatMessage()によると”指定されたファイルが見つかりません”だそうですが、いったい何のことでしょう?
FormatMessage は、ヒントになるメッセージを返してくれることもありますが、見当違いのメッセージを返すこともあります。
的確な答えとは考えずに、参考程度に見ておくのが良いでしょう。
こういう掲示板でよく言われることとして
「質問する前にご自分で調べて、その結果を書き込んでください」
は既に言いましたが、もうひとつ
「現象が再現できる、必要最小限のソースコードを載せてください」
というのもあります。
要するに、貴方が今書いているソースコードを、必要なだけコピペしてください、ということです。
>要するに、貴方が今書いているソースコードを、必要なだけコピペしてください、ということです。
ソースはこうなってます。
WNDCLASSEX EditClass;
LPVOID lpMsgBuf;
EditClass.cbSize = sizeof(WNDCLASSEX);
EditClass.style = CS_DBLCLKS ;//| CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW;
EditClass.lpfnWndProc = (WNDPROC)EditProc;
EditClass.hInstance = hEDInst;
EditClass.hIcon = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
MAKEINTRESOURCE(IDC_IBEAM),
IMAGE_CURSOR,
0,0,
LR_DEFAULTSIZE | LR_SHARED);
EditClass.hIcon = NULL;
EditClass.hCursor = NULL;
EditClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
EditClass.lpszMenuName = NULL;
EditClass.lpszClassName = PClassName;
SetLastError(NO_ERROR);
if(RegisterClassEx(&EditClass) == 0) {
FormatMessage(//エラー表示文字列作成
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(hwnd,
(const char*)lpMsgBuf, NULL, MB_OK);
LocalFree(lpMsgBuf);
return FALSE;
}
とするとさきほどのメッセージが出ます。
構造体のメンバの指定漏れがあるのでしょうか?
> 構造体のメンバの指定漏れがあるのでしょうか?
とりあえず……
cbClsExtraメンバ・cbWndExtraメンバ・hIconSmメンバに不定値が入っていますね。
WNDCLASSEX EditClass = {0};
とするか、
ZeroMemory(&EditClass, sizeof(WNDCLASSEX));
として0でクリアから各メンバを設定した方が安全かと。
あと…
> EditClass.hIcon = (HCURSOR)LoadImage(NULL,
> MAKEINTRESOURCE(IDI_APPLICATION),
> MAKEINTRESOURCE(IDC_IBEAM),
> IMAGE_CURSOR,
> 0,0,
> LR_DEFAULTSIZE | LR_SHARED);
> EditClass.hIcon = NULL;
LoadImage()がムダになっていますが。
2番目のhIconはhIconSmの間違いではないですか?
すいません。解決しました。
EditClass.hInstance = hEDInst;
の部分が原因でした。どうやらこれを買ってみ作ってはいけないようです(メインウィンドウのものを使うと成功しました。)。
>LoadImage()がムダになっていますが。
>2番目のhIconはhIconSmの間違いではないですか?
とりあえず、子ウィンドウなのでアイコンは使用しないことにしました。
>WNDCLASSEX EditClass = {0};
>とするか、
>ZeroMemory(&EditClass, sizeof(WNDCLASSEX));
>として0でクリアから各メンバを設定した方が安全かと。
これはやってみます。ご指摘ありがとうございます。
皆さん、ありがとうございました。
ツイート | ![]() |