ロビー,スクロールバーが最下部になければスクロールしない機能がようやく実装完了。MFCを使用している場合,下のようなコードで OK と思われる。
// 元々選択されていた部分を保存 long org_start, org_end; richEdit.GetSel(org_start, org_end); // スタイルを変更するかどうか bool modifyStyle = false; // 変更前のスタイル LONG style = ::GetWindowLong(richEdit.GetSafeHwnd(), GWL_STYLE); // スクロールバーが存在 if((style & WS_VSCROLL) != 0) { // スクロール情報を取得 SCROLLINFO scrollInfo; if(richEdit.GetScrollInfo(SB_VERT, &scrollInfo)) { // 選択されているか,最終行でなければスタイルを変更する if((org_start != org_end) || (scrollInfo.nPos < (scrollInfo.nMax - static_cast<int>(scrollInfo.nPage)))) { modifyStyle = true; } } } if(modifyStyle) { // ECO_AUTOVSCROLL スタイルを解除する richEdit.SetOptions(ECOOP_XOR, ECO_AUTOVSCROLL); } // カーソルを最後に持っていく richEdit.SetSel(0x7ffffffe,0x7fffffff); // 追加部分の開始位置を保存 long start_start, start_end; richEdit.GetSel(start_start, start_end); // メッセージを追加 richEdit.ReplaceSel(message); // 追加部分の終了位置を保存 long end_start, end_end; richEdit.GetSel(end_start, end_end); // RichEdit 用フォントフォーマットを作成 CHARFORMAT2 format; format.cbSize = sizeof(CHARFORMAT); format.dwMask = CFM_COLOR | CFM_SIZE | CFM_FACE | CFM_BOLD | CFM_ITALIC; format.yHeight = font_size; format.dwEffects = (font_bold ? CFE_BOLD : 0) | (font_italic ? CFE_ITALIC : 0); strcpy(format.szFaceName, font_name.c_str()); format.crTextColor = font_color; // 追加文字を選択 richEdit.SetSel(start_start, end_start); // フォントを設定 richEdit.SetSelectionCharFormat(format); // 選択部分を元に戻す if(org_start == org_end) { // 選択範囲がなければカレットを最後に置く org_start = 0x7ffffffe; org_end = 0x7fffffff; } richEdit.SetSel(org_start, org_end); if(modifyStyle) { // ECO_AUTOVSCROLL スタイルを元に戻す richEdit.SetOptions(ECOOP_OR, ECO_AUTOVSCROLL); }
というところでロビークライアントをアップ。変更点は,
- 発言エディットボックスの自動水平スクロールを外し,俗に言う右端で折り返すようにする
- スクロールバーが一番下にない,もしくは選択がある場合は自動スクロールしないようにする
- ロビーに入るときのメッセージを表示
- 部屋入室メッセージを指定,表示できるようにする
- 新しいロビークライアントがあった場合,メッセージが出るようにする
- ゲームクライアントのバージョンを表示するようにする
ただし,上の2つ以外は明日辺りにロビーサーバを再起動した後有効になる。また,旧ロビークライアントでも接続出来るが,メッセージは表示されない。