还是VC++中有关显示图像的问题。
我们在显示一幅比较大的图像时,要使用带标准滚动条的对话框。涉及对滚动条的操作就不得不提SCROLLINFO这个结构体。只看单词意思就这道这个结构体要储存滚动条的一些信息。究竟是哪些信息呢?我们先看看这个结构体的定义:
本人不才!花了很长时间写了这个代码。不是很好,比起Windows自带的字体对话框差一点。
不过已经够用了。等将来有时间了,在进行完善。
如果有什么好的建议,可以提。本人再补。
预览效果如下图:
package styleDispose; import java.awt.GraphicsEnvironment; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.ListModel; import java.awt.Font; import javax.swing.JPanel; import java.awt.Rectangle; import javax.swing.JScrollPane; import javax.swing.BorderFactory; import javax.swing.border.TitledBorder; import java.awt.Color; import javax.swing.JList; import javax.swing.JLabel; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JTextField; import javax.swing.border.BevelBorder; import javax.swing.border.SoftBevelBorder; import javax.swing.JButton; import javax.swing.SwingConstants; public class FontChooserDialog extends JDialog { /** * */ private static final long serialVersionUID = 1L; /** * 界面设计需要 * */ private JPanel jPanel = null; private JScrollPane jScrollPane = null; private JPanel jPanel1 = null; private JLabel jLabel = null; private JLabel jLabel1 = null; private JLabel jLabel2 = null; private JTextField fontNameText = null; private JTextField fontItalicText = null; private JTextField fontSizeText = null; private JList fontNameList = null; private JList fontItalicList = null; private JList fontSizeList = null; private JPanel jPanel2 = null; private JButton okButton = null; private JButton regitButton = null; private JButton cancleButton = null; private JScrollPane jScrollPane1 = null; private JScrollPane jScrollPane2 = null; private JScrollPane jScrollPane3 = null; private static JLabel fontStyle = null; /** * 字体默认变量 * */ private Font defaultFont = new Font("\u5b8b\u4f53", Font.PLAIN, 12); /** * 返回字体变量 * */ private static Font returnFont = null; /** * Boolean 变量,判断是否正常返回,是否用户选择了字体 * */ private static boolean judge = false; /** * 以防止事件重复调用或不必要的更改,定义两个boolean变量分别 * 为:fontNameList和fontSizeList判断 * 等于true则循环调用,false则不 * */ private boolean nameJuge = true; private boolean sizeJuge = true; public FontChooserDialog(){ this(null); } public FontChooserDialog(JFrame jframe){ this(jframe,true); } public FontChooserDialog(JFrame jframe,boolean boo){ this(jframe,boo,null); } public FontChooserDialog(JFrame jframe,boolean boo,Font font){ super(jframe,boo); initialize(); initializeFont(font); this.setLocationRelativeTo(jframe); } /** * This method initializes this * */ private void initialize() { this.setContentPane(getJPanel()); this.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); this.setBounds(new Rectangle(0, 0, 430, 335)); this.setTitle("字体选择对话框"); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { judge = false; closeWindow(); } }); } public static Font showDialog(JFrame jframe,boolean boo){ return showDialog(jframe,boo,null); } public static Font showDialog(JFrame jframe,boolean boo,Font font){ JDialog jd = new FontChooserDialog(jframe,boo,font); jd.setVisible(true); if(judge){returnFont = fontStyle.getFont();} jd.dispose(); return returnFont; } /** * This method initializes jPanel * * @return javax.swing.JPanel */ private JPanel getJPanel() { if (jPanel == null) { jPanel = new JPanel(); jPanel.setLayout(null); jPanel.setFont(new Font("Dialog", Font.PLAIN, 12)); jPanel.add(getJPanel1(), null); jPanel.add(getJPanel2(), null); jPanel.add(getOkButton(), null); jPanel.add(getRegitButton(), null); jPanel.add(getCancleButton(), null); } return jPanel; } /** * This method initializes jScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { fontStyle = new JLabel(); fontStyle.setText("你好!天生我才必有用!Hello World!"); fontStyle.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); fontStyle.setHorizontalAlignment(SwingConstants.CENTER); fontStyle.setHorizontalTextPosition(SwingConstants.CENTER); jScrollPane = new JScrollPane(); jScrollPane.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); jScrollPane.setViewportView(fontStyle); jScrollPane.setBounds(new Rectangle(5, 20, 400, 60)); } return jScrollPane; } /** * This method initializes jPanel1 * * @return javax.swing.JPanel */ private JPanel getJPanel1() { if (jPanel1 == null) { jLabel2 = new JLabel(); jLabel2.setBounds(new Rectangle(285, 5, 120, 15)); jLabel2.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); jLabel2.setText("大小:"); jLabel1 = new JLabel(); jLabel1.setBounds(new Rectangle(160, 5, 120, 15)); jLabel1.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); jLabel1.setText("字型:"); jLabel = new JLabel(); jLabel.setBounds(new Rectangle(5, 5, 150, 15)); jLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED); jLabel.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); jLabel.setText("字体:"); jPanel1 = new JPanel(); jPanel1.setLayout(null); jPanel1.setBounds(new Rectangle(5, 5, 410, 175)); jPanel1.setBorder(new SoftBevelBorder(SoftBevelBorder.LOWERED)); jPanel1.add(jLabel, null); jPanel1.add(jLabel1, null); jPanel1.add(jLabel2, null); jPanel1.add(getFontNameText(), null); jPanel1.add(getFontItalicText(), null); jPanel1.add(getFontSizeText(), null); jPanel1.add(getJScrollPane1(), null); jPanel1.add(getJScrollPane2(), null); jPanel1.add(getJScrollPane3(), null); } return jPanel1; } /** * This method initializes fontNameText * * @return javax.swing.JTextField */ private JTextField getFontNameText() { if (fontNameText == null) { fontNameText = new JTextField(); fontNameText.setBounds(new Rectangle(5, 25, 150, 20)); fontNameText.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); fontNameText.addKeyListener(new KeyAdapter(){ public void keyTyped(KeyEvent e) { String oldText = fontNameText.getText(); String newText = ""; if("".equals(fontNameText.getSelectedText()) && null == fontNameText.getSelectedText()){ newText = fontNameText.getText()+e.getKeyChar(); }else{ newText = oldText.substring(0,fontNameText.getSelectionStart())+e.getKeyChar()+oldText.substring(fontNameText.getSelectionEnd()); } System.out.println("fontName:"+newText); nameJuge = false; fontNameList.setSelectedValue(getLateIndex(fontNameList,newText),true); nameJuge = true; } }); } return fontNameText; } /** * This method initializes fontItalicText * * @return javax.swing.JTextField */ private JTextField getFontItalicText() { if (fontItalicText == null) { fontItalicText = new JTextField(); fontItalicText.setBounds(new Rectangle(160, 25, 120, 20)); fontItalicText.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); fontItalicText.setEnabled(false); } return fontItalicText; } /** * This method initializes fontSizeText * * @return javax.swing.JTextField */ private JTextField getFontSizeText() { if (fontSizeText == null) { fontSizeText = new JTextField(); fontSizeText.setBounds(new Rectangle(285, 25, 120, 20)); fontSizeText.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); fontSizeText.setColumns(4); fontSizeText.addKeyListener(new KeyAdapter(){ public void keyTyped(KeyEvent e) { //System.out.println("Key Code:"+(Character.getNumericValue(e.getKeyChar())==-1)); String oldText = fontSizeText.getText(); String newText = ""; if("".equals(fontSizeText.getSelectedText()) && null == fontSizeText.getSelectedText()){ newText = fontSizeText.getText()+e.getKeyChar(); }else{ newText = oldText.substring(0,fontSizeText.getSelectionStart())+e.getKeyChar()+oldText.substring(fontSizeText.getSelectionEnd()); } //System.out.println("fontSize:"+newText); sizeJuge = false; fontSizeList.setSelectedValue(getLateIndex(fontSizeList,newText),true); if(newText.matches("(\\d)+")){ fontStyle.setFont(new Font(fontStyle.getFont().getFontName(),fontStyle.getFont().getStyle(),Integer.parseInt(newText))); } sizeJuge = true; } }); } return fontSizeText; } /** * This method initializes fontNameList * * @return javax.swing.JList */ private JList getFontNameList() { if (fontNameList == null) { fontNameList = new JList(GraphicsEnvironment.getLocalGraphicsEnvironment() .getAvailableFontFamilyNames()); fontNameList.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); fontNameList .addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent e) { if(nameJuge){fontNameText.setText(fontNameList.getSelectedValue().toString());} fontStyle.setFont(new Font(fontNameList.getSelectedValue().toString(),fontStyle.getFont().getStyle(),fontStyle.getFont().getSize())); } }); } return fontNameList; } /** * This method initializes fontItalicList * * @return javax.swing.JList */ private JList getFontItalicList() { if (fontItalicList == null) { fontItalicList = new JList(new String[]{"Plain", "Bold", "Italic","Bold Italic"}); fontItalicList.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); fontItalicList .addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent e) { fontItalicText.setText(fontItalicList.getSelectedValue().toString()); fontStyle.setFont(new Font(fontStyle.getFont().getFontName(),fontItalicList.getSelectedIndex(),fontStyle.getFont().getSize())); } }); } return fontItalicList; } /** * This method initializes fontSizeList * * @return javax.swing.JList */ private JList getFontSizeList() { if (fontSizeList == null) { fontSizeList = new JList(new String[]{"3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "22", "24", "27", "30", "34", "39", "45", "51", "60"}); fontSizeList.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); fontSizeList .addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent e) { if(sizeJuge){fontSizeText.setText(fontSizeList.getSelectedValue().toString());} fontStyle.setFont(new Font(fontStyle.getFont().getFontName(),fontStyle.getFont().getStyle(),Integer.parseInt(fontSizeList.getSelectedValue().toString()))); } }); } return fontSizeList; } /** * This method initializes jPanel2 * * @return javax.swing.JPanel */ private JPanel getJPanel2() { if (jPanel2 == null) { jPanel2 = new JPanel(); jPanel2.setLayout(null); jPanel2.setBounds(new Rectangle(3, 180, 414, 90)); jPanel2.setBorder(BorderFactory.createTitledBorder(null, "\u6548\u679c\u9884\u89c8", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("\u5b8b\u4f53", Font.PLAIN, 12), new Color(51, 51, 51))); jPanel2.add(getJScrollPane(), null); } return jPanel2; } /** * This method initializes okButton * * @return javax.swing.JButton */ private JButton getOkButton() { if (okButton == null) { okButton = new JButton(); okButton.setBounds(new Rectangle(215, 275, 60, 20)); okButton.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); okButton.setText("确定"); okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { judge = true; closeWindow(); } }); } return okButton; } /** * This method initializes regitButton * * @return javax.swing.JButton */ private JButton getRegitButton() { if (regitButton == null) { regitButton = new JButton(); regitButton.setBounds(new Rectangle(285, 275, 60, 20)); regitButton.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); regitButton.setText("重置"); regitButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { initializeFont(null); } }); } return regitButton; } /** * This method initializes cancleButton * * @return javax.swing.JButton */ private JButton getCancleButton() { if (cancleButton == null) { cancleButton = new JButton(); cancleButton.setBounds(new Rectangle(355, 275, 60, 20)); cancleButton.setFont(new Font("\u5b8b\u4f53", Font.PLAIN, 12)); cancleButton.setText("取消"); cancleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { judge = false; closeWindow(); } }); } return cancleButton; } /** * This method initializes jScrollPane1 * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane1() { if (jScrollPane1 == null) { jScrollPane1 = new JScrollPane(); jScrollPane1.setBounds(new Rectangle(5, 50, 150, 120)); jScrollPane1.setViewportView(getFontNameList()); } return jScrollPane1; } /** * This method initializes jScrollPane2 * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane2() { if (jScrollPane2 == null) { jScrollPane2 = new JScrollPane(); jScrollPane2.setBounds(new Rectangle(160, 50, 120, 120)); jScrollPane2.setViewportView(getFontItalicList()); } return jScrollPane2; } /** * This method initializes jScrollPane3 * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane3() { if (jScrollPane3 == null) { jScrollPane3 = new JScrollPane(); jScrollPane3.setBounds(new Rectangle(285, 50, 120, 120)); jScrollPane3.setViewportView(getFontSizeList()); } return jScrollPane3; } /** * 默认的字体初始化方法 * */ private void initializeFont(Font font){ if(font!=null){ defaultFont = font; fontStyle.setFont(defaultFont); } fontStyle.setFont(defaultFont); fontNameList.setSelectedValue(defaultFont.getFontName(), true); fontSizeList.setSelectedValue(new Integer(defaultFont.getSize()).toString(), true); fontItalicList.setSelectedIndex(defaultFont.getStyle()); } /** * 判断里给定的值最近的索引 * */ private Object getLateIndex(JList jlist,String str){ ListModel list = jlist.getModel(); if(str.matches("(\\d)+")){ for(int i = list.getSize()-1;i>=0;i--){ if(Integer.parseInt(list.getElementAt(i).toString())<=Integer.parseInt(str)){ return list.getElementAt(i); } } }else { for(int i = list.getSize()-2;i>=0;i--){ if(str.compareToIgnoreCase(list.getElementAt(i).toString())==0){ return list.getElementAt(i); }else if(str.compareToIgnoreCase(list.getElementAt(i).toString())>0){ return list.getElementAt(i+1); } } } return list.getElementAt(0); } /** * 窗体关闭方法! * */ private void closeWindow(){ this.setVisible(false); } } // @jve:decl-index=0:visual-constraint="91,34"
最近做项目涉及到时间的计算,这里拿出一个以年为增长的计算,关于日期的计算可以借助Calendar类,其中涉及使用正则去得到字符串中的数字参加计算,顺带一提Pattern类和Matcher类。
Pattern类:pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数
Matcher类:Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要 调用 Pattern 对象的matcher 方法来获得一个 Matcher 对象。部分代码如下:
public int inserMaintainHeader(MaintainHeader maintainHeader) { maintainHeader.setId(IdGenerateUtil.generateId()); maintainHeader.setCreateBy("test"); maintainHeader.setCreateDate(new Date()); Pattern pattern = Pattern.compile("[^0-9]"); //这里前端传的值为"1年","2年"...而我们只需要拿到数字1或2去参与计算 String warrantyPeriod = maintainHeader.getWarrantyPeriod(); if (StringUtils.isNotBlank(warrantyPeriod)) { Matcher matcher = pattern.matcher(warrantyPeriod); String yearStr = matcher.replaceAll(""); int year = Integer.parseInt(yearStr); //计算保养计划结束时间 //1,合格证日期早于开梯日期 Date qualifiedDate = maintainHeader.getQualifiedDate();//获取合格证日期 Date ladderDate = maintainHeader.getLadderDate();//获取开梯日期 Calendar calendar = new GregorianCalendar(); Date afterDate = new Date(); if (qualifiedDate.getTime() <= ladderDate.getTime()) { calendar.setTime(qualifiedDate); calendar.add(calendar.YEAR, year); afterDate=calendar.getTime(); maintainHeader.setPlanEndDate(afterDate); } //2,合格证日期晚于开梯日期 if (qualifiedDate.getTime() > ladderDate.getTime()) { calendar.setTime(maintainHeader.getInspectPassDate()); calendar.add(calendar.YEAR, year); afterDate=calendar.getTime(); maintainHeader.setPlanEndDate(afterDate); } } int i = this.dao.insert(maintainHeader); return i; }
今天上课,老师让我们用matlab进行汉明码编码译码的实现,之前上通信原理课程的时候老师顺带提过一句,现在已然是记不太清了,所以上网搜索了一下关于汉明码的原理。
汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。。。。。。
简单来说,汉明码就是一个可以校验和纠错的编码。
首先记住一个公式:
, n是你要编码的数组长度,k是验证码字的个数
我们现在以k=4,n=7的实例来说明汉明码的编码原理:
a=[1,0,1,0,1,1,1]
因为n+k=11,我们要编码出来的是一个长度为11的数组,其中四位是校验码
根据k值的不同,我们可以吧原始数组分为k组,将原始数组的下标分别转换为二进制
第一组的分别是末位为1的下标:XXX1
第二组的分别是次末位为1的下标:XX1X
第三组的分别是次位为1的下标:X1XX
第四组的分别是首位为1的下标:1XXX
所以第一组P1的下标分别为:3,5,7,9,11
第二组:3,6,7,10,11
第三组:5,6,7
第四组:9,10,11
每一个校验位的数值是组内每一个元素数值的奇偶数
对于译码:
假设接收到长度为11的数组进行译码,先取出校验码,然后用每个组的元素进行奇偶的校验,如果错误,则该组的一个校验状态转为错误,记为1,通过对四个组进行奇偶校验,用每个组的奇偶校验值可以得出一个数组,用该数组即可算出数据错误位置
假设传递时最后一位发生错误,则1,3,4组受到影响,校验数组为[1,0,1,1],通过计算2^3+2^1+2^0=11为错误位置
以下为代码:
clc a=[1,0,1,0,1,1,1]; a h1=HamingCode(a,4); h1 h2=HamingDecode(h1,4); h2
function h = HamingCode(a,k) n=length(a(:)); z=1; j=1; h=zeros(1,n+k); for i=1:n+k %将输入数组写入全零矩阵待用,且跳过验证 if i==2^(z-1) z=z+1; continue else h(i)=a(j); j=j+1; end end if k==4 h(1)=rem(h(3)+h(5)+h(7)+h(9)+h(11),2); h(2)=rem(h(3)+h(6)+h(7)+h(10)+h(11),2); h(4)=rem(h(5)+h(6)+h(7),2); h(8)=rem(h(9)+h(10)+h(11),2); else if k==3 h(1)=rem(h(3)+h(5)+h(7),2); h(2)=rem(h(3)+h(6)+h(7),2); h(4)=rem(h(5)+h(6)+h(7),2); else if k==2 h(1)=rem(h(3),2); h(2)=rem(h(3),2); end end end
function h = HamingDecode(a,k) %a=[1,0,1,1,0,1,0,1,1,1,0]; n=length(a(:)); %求输入数组长度 h=zeros(1,n-k); %解码和译码的n含义不同 check=zeros(1,k); %四个组的验证数组 che=0; if k==4 if a(1)~=rem(a(3)+a(5)+a(7)+a(9)+a(11),2); %四个组,如果有任意一个组验证不通过,则相应数组的变量变为1,标志位che变成1,方便后面修改 check(1)=1 che=1 else if a(2)~=rem(a(3)+a(6)+a(7)+a(10)+a(11),2); check(2)=1 che=1; else if a(4)~=rem(a(5)+a(6)+a(7),2); check(4)=1 che=1; else if a(8)~=rem(a(9)+a(10)+a(11),2); check(8)=1 che=1; end end end end j=1; z=1; if che==1 %假如验证生效 s= 2^(3*check(1))+2^(2*check(2))+2^(1*check(3))+2^(check(4)*0) a(s)=1-a(s) end for i=1:n %跳过验证码,将数组写入输出数组 if i==2^(z-1) z=z+1; continue else h(j)=a(i); j=j+1; end end end
本人对于汉明码理解借鉴了其他博主文章,传送门:https://blog.csdn.net/Yonggie/article/details/83186280
还是VC++中有关显示图像的问题。
我们在显示一幅比较大的图像时,要使用带标准滚动条的对话框。涉及对滚动条的操作就不得不提SCROLLINFO这个结构体。只看单词意思就这道这个结构体要储存滚动条的一些信息。究竟是哪些信息呢?我们先看看这个结构体的定义:
typedef struct tagSCROLLINFO{UINT cbSize ; // SCROLLINFO结构体长度的字节数UINT fMask ; // 指定结构体中哪些成员有效int nMin; // 滚动范围最小尺寸int nMax; // 滚动范围的最小尺寸UINT nPage ; // 页尺寸,用来确定比例滚动框的大小int nPos ; // 滚动框的位置int nTrackPos ; //}SCROLLINFO,*LPSCROLLINFO;typedef SCROLLINFO CONST *LPCSCROLLINFO好了,与其说这个结构体储存的是滚动条的信息,不如说它储存了滚动块的信息。滚动块就是滚动条上的那个滑块。下面我们具体说说这个结构体中几个成员的含义。首先,fMask,指定哪些成员有效,它的值是这些常亮:SIF_ALL,表示整个结构体都有效,SIF_PAGE,表示nPage成员有效,SIF_POS:nPos成员有效,SIF_RANGE, nMax和nMin有效。这些常量可以用或连接。nMin:这个值我们通常都设定为0nMax: 对于这个值,如果我们想在整个客户区显示一个比客户区还要大的图片,这个值就应该等于图片大小和客户区大小的差(水平和竖直两个方向上)nPage:这个属性表示页尺寸,怎么理解这个属性呢。首先,它的设置是为了根据比例确定滚动块的大小。这个值通常就取客户区的大小。但是要特别注意:当nMax<=nPage时,这时候如果使用nPage属性,将不会显示滚动条!!!!前面说过,nPage的设置是为了根据比例设置滚动块的大小。我们平时看到的滚动条的滚动块有大有小,有的滚动块的大小还会随着浏览篇幅的变化而变化。与这个nPage属性有很大关系。但是:nMax<=nPage不代表没有必要使用滚动条,只要nMax>nMin ,就是需要滚动条的,但是当nMax<nPage时,我们通常不设置nPage 属性(设置分fMask时不选SIF_PAGE),这样就可以显示出滚动条了,只不过滚动块的大小是标准大小,不是根据比例确定的大小而已。转载于:https://www.cnblogs.com/qingergege/p/4983036.html