• 文本框粘贴时兼容Unix、Mac换行符的方法源码


    本篇文章属于《518抽奖软件开发日志》系列文章的一部分。

    我在开发《518抽奖软件》(www.518cj.net)的时候,要在文本框粘贴从别处复制来的名单。发现一个问题,就是一些Unix传过来的多行文本,粘贴后都变成了一行。原来,它的换行符跟Winodws的不一致导致的。解决方法就是,窗口子类化,在新的窗口过程中,专门处理这个粘贴消息,兼容Windows、Mac、Unix三种不同的文本换行符。具体代码如下:

    1. void Tapp::subclass_init()
    2. {
    3. oldProc = (WNDPROC)SetClassLong(GetDlgItem(m_hLoading, IDC_loading_subclass), GCL_WNDPROC, (LONG)Proc_editBox);
    4. }
    5. void Tapp::subclass_remove()
    6. {
    7. if (oldProc)
    8. {
    9. SetClassLong(GetDlgItem(m_hLoading, IDC_loading_subclass), GCL_WNDPROC, (LONG)oldProc);
    10. oldProc = NULL;
    11. }
    12. }
    13. static LRESULT CALLBACK Proc_editBox(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    14. {
    15. // 在粘贴时,处理换行符不一致
    16. if (uMsg == WM_PASTE)
    17. {
    18. if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
    19. return 0;
    20. if (!OpenClipboard(hwnd))
    21. return 0;
    22. HGLOBAL h = GetClipboardData(CF_UNICODETEXT);
    23. if (!h) { CloseClipboard(); return 0; }
    24. WCHAR* p = (WCHAR*)GlobalLock(h);
    25. if (!p) { GlobalUnlock(h); CloseClipboard(); return 0; }
    26. BOOL bSingle = TRUE;
    27. LONG style = GetWindowLong(hwnd, GWL_STYLE);
    28. if (style & ES_MULTILINE) bSingle = FALSE;
    29. //------------------------------------------------- rslt
    30. wstring rslt;
    31. for (int i = 0; 1; i++)
    32. {
    33. if (p[i] == 0) break;
    34. else if (p[i] == L'\r')
    35. {
    36. if (bSingle) break;
    37. rslt += L"\r\n";
    38. if (p[i + 1] == L'\n') i++;
    39. }
    40. else if (p[i] == L'\n')
    41. {
    42. if (bSingle) break;
    43. rslt += L"\r\n";
    44. }
    45. else rslt += p[i];
    46. }
    47. //------------------------------------------------- ↑
    48. SendMessage(hwnd, EM_REPLACESEL, TRUE, (LPARAM)rslt.c_str());
    49. GlobalUnlock(h);
    50. CloseClipboard();
    51. return 0;
    52. }
    53. // 支持回车、Tab字符输入
    54. else if (uMsg == WM_GETDLGCODE && hwnd == hTextBox)
    55. return DLGC_WANTALLKEYS | DLGC_WANTARROWS | DLGC_WANTCHARS | DLGC_WANTMESSAGE | DLGC_WANTTAB;
    56. // 继续执行旧的窗口过程
    57. return CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam);
    58. }

  • 相关阅读:
    【树莓派不吃灰】Linux服务器篇(核心概念)
    10个自动EDA库功能介绍:几行代码进行的数据分析靠不靠谱
    控制台中查看莫格命令的详细信息
    关于git版本控制在IDEA中的使用
    相关回归常见问题
    Linux C/C++ 系统错误
    阿里三面:MQ 消息丢失、重复、积压问题,如何解决?
    防火墙 iptables
    LeetCode_链表的回文结构
    PHP 智能物业管理系统mysql数据库web结构apache计算机软件工程网页wamp
  • 原文地址:https://blog.csdn.net/WSG121212/article/details/132814578