色分け

解決


初心者  2004-12-27 23:19:05  No: 55817

秀丸やサクラエディタのように、ソースなどを色分けして表示するエディタを作りたいのですが、どうすればよいのでしょうか?
どなたかよろしくお願いします。


シャノン  2004-12-27 23:38:41  No: 55818

リッチテキストを使うとお手軽に出来そうですが、あまりお勧めできません。
ああいうエディタは、エディットコントロールを使わずに、全て自力でテキストを描画しています。
サクラエディタならソースが公開されていますから、見てみてはいかが?


初心者  2004-12-28 00:00:56  No: 55819

わかりました。
がんっばて作成してみます。


初心者  2005-01-03 20:39:26  No: 55820

解決を押してしまった後ですいません。
自分なりに考えてみましたが、Windowクラスの登録(RegisterClass)のところで失敗するようです。
原因がわからないのですが、どなたか助けてください。


YuO  2005-01-04 00:33:51  No: 55821

RegisterClassの失敗した原因はなんですか?
GetLastErrorはなんで失敗したと言っているのですか?


初心者  2005-01-04 20:22:28  No: 55822

え?それは何ですか?すいませんが詳しく教えてください。


シャノン  2005-01-04 20:25:47  No: 55823

> え?それは何ですか?

質問する前に、多少なりともご自分で調べられましたか?
Google(http://www.google.co.jp/)で「GetLastError」を検索すれば、いくらでも資料は見つかると思いますが


初心者  2005-01-04 20:39:37  No: 55824

シャノンさん、すいません。そのとおりでした。

そこでこのようなコードを書いてみると、
DWORD x;
char *y;
x=GetLastError();
wsprintf(y,"%d",x);
MessageBox(NULL,y,"Debug",MB_OK);


初心者  2005-01-04 20:40:52  No: 55825

すいません。結果を書き忘れていました。
2 と書かれたメッセージが出てきました。


初心者  2005-01-04 20:55:14  No: 55826

FormatMessage()によると”指定されたファイルが見つかりません”だそうですが、いったい何のことでしょう?


シャノン  2005-01-04 21:33:41  No: 55827

本題から外れますが

> DWORD x;
> char *y;
> x=GetLastError();
> wsprintf(y,"%d",x);
> MessageBox(NULL,y,"Debug",MB_OK);

これはマズいです。
どうマズいかは、このスレでは追求しないことにしましょう。

> FormatMessage()によると”指定されたファイルが見つかりません”だそうですが、いったい何のことでしょう?

FormatMessage は、ヒントになるメッセージを返してくれることもありますが、見当違いのメッセージを返すこともあります。
的確な答えとは考えずに、参考程度に見ておくのが良いでしょう。

こういう掲示板でよく言われることとして
「質問する前にご自分で調べて、その結果を書き込んでください」
は既に言いましたが、もうひとつ
「現象が再現できる、必要最小限のソースコードを載せてください」
というのもあります。

要するに、貴方が今書いているソースコードを、必要なだけコピペしてください、ということです。


初心者  2005-01-04 23:01:31  No: 55828

>要するに、貴方が今書いているソースコードを、必要なだけコピペしてください、ということです。

ソースはこうなってます。

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;  
  }

とするとさきほどのメッセージが出ます。
構造体のメンバの指定漏れがあるのでしょうか?


瀬戸っぷ  2005-01-05 01:19:15  No: 55829

> 構造体のメンバの指定漏れがあるのでしょうか?

とりあえず……
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の間違いではないですか?


初心者  2005-01-05 06:09:19  No: 55830

すいません。解決しました。
EditClass.hInstance = hEDInst;
の部分が原因でした。どうやらこれを買ってみ作ってはいけないようです(メインウィンドウのものを使うと成功しました。)。
>LoadImage()がムダになっていますが。
>2番目のhIconはhIconSmの間違いではないですか?

とりあえず、子ウィンドウなのでアイコンは使用しないことにしました。

>WNDCLASSEX EditClass = {0};
>とするか、
>ZeroMemory(&EditClass, sizeof(WNDCLASSEX));
>として0でクリアから各メンバを設定した方が安全かと。

これはやってみます。ご指摘ありがとうございます。

皆さん、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加