import java.awt.event.*
import javax.swing.*
import java.io.File
public class PhotoFrame extends JFrame implements ActionListener{ Canvas photo
JPanel p
JButton open,bigger,smaller,rotate,exit
JScrollPane sp
JFileChooser fc
int w = 150
int h = 150
Image image
int rate = 10//图片放缩率(单位:像素)
public PhotoFrame(){
init()
this.setTitle ("Java图片查看器")
this.setSize (600,500)
this.setLocationRelativeTo (this)//窗口居中
this.setVisible (true)
this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE)
}
public void init(){
photo = new Photo()
sp = new JScrollPane(photo)
p = new JPanel()
open = new JButton("open")
bigger = new JButton(" + ")
smaller = new JButton(" - ")
rotate = new JButton(" の ")
exit = new JButton("exit")
//设置前景色
open.setForeground (Color.BLUE)
bigger.setForeground (Color.GREEN)
smaller.setForeground (Color.GREEN)
rotate.setForeground (Color.GREEN)
exit.setForeground (Color.RED)
//设置提示文本
open.setToolTipText ("打开文件")
bigger.setToolTipText ("放大")
smaller.setToolTipText ("缩小")
rotate.setToolTipText ("翻转")
exit.setToolTipText ("退出程序")
//设置边框
p.setBorder (BorderFactory.createEtchedBorder ())
p.add (open)
p.add (bigger)
p.add (smaller)
p.add (rotate)
p.add (exit)
add(sp,BorderLayout.CENTER)
add(p,BorderLayout.SOUTH)
open.addActionListener (this)
bigger.addActionListener (this)
smaller.addActionListener (this)
rotate.addActionListener (this)
exit.addActionListener (this)
}
public static void main(String[] args){
new PhotoFrame()
} public void actionPerformed (ActionEvent e){
if(e.getSource ()==open){//打开
fc = new JFileChooser()
int returnval = fc.showOpenDialog(this)
if(returnval == JFileChooser.APPROVE_OPTION){
File f = fc.getSelectedFile ()
String fileName = f.getName ()
String filePath=fc.getSelectedFile().getAbsolutePath()
System.out.println(filePath)
this.setTitle (fileName+"-Java图片查看器")
//通过文件路径获得图片
image = new ImageIcon(filePath).getImage ()
//获取图片的宽和高
w = image.getWidth (this)
h = image.getHeight (this)
}
}else if(e.getSource ()==bigger){//放大
if(w>0) w+= rate
else w-= rate
if(h>0)h+= rate
else h-= rate
}else if(e.getSource ()==smaller){//缩小
if(w>0) w-= rate
else w+= rate
if(h>0) h-= rate
else h+= rate
}else if(e.getSource ()==rotate){//翻转
if(w>0&&h>0){
h*=-1
}else if(w>0&&h<0){
w*=-1
}else if(w<0&&h<0){
h*=-1
}else if(w<0&&h>0){
w*=-1
}
}else{//退出
System.exit(0)
}
photo.repaint ()//重新绘制
}
class Photo extends Canvas{
public void paint(Graphics g){
int width = this.getWidth()
int height = this.getHeight()
//设置图片左上角坐标
int x = (width-w)/2
int y = (height-h)/2
//绘制图片
g.drawImage(image, x, y, w, h,this)
}
}
}
三、补充:1、滚动面板功能没有具体实现2、放大缩小率应该按照图片宽高比来设置,最好用一个滚动条来放大缩小3、翻转功能需要改进 楼主自己试着完善下...
登录首页
学习
实践
活动
专区
工具
TVP
返回腾讯云官网
全栈程序员站长
55.1K 篇文章
关注
2022-09-06 09:52:05阅读 1730
大家好,又见面了,我是你们的朋友全栈君。
前言
c# 正编译生成debug,exe等文件,同样也可以通过exe反编译生成相对应的文件,一劳永逸,任君选择(`・ω・´) (我们老师为了给我们看要求效果给了我们一个半成品exe,cv工程师上线了,真为所欲为)
问题描述
验证简易相册程序的实现(不需要写入报告)
设计一个类似Windows写字板的程序,使其具有以下功能:
提供基本的写字板功能,如文件的打开,保存,支持txt、rtf;
实现多格式的文本的编辑、修饰等,均有相应的菜单来控制,常用的菜单项配备相应的工具栏按钮(可参照Windows自带的写字板)
按需添加其他的代码,如窗口的布局等;
实现自定义的查找对话框,有能力的同学可进一步实现替换/全文替换等功能
状态栏中显示学生学号、姓名等信息,在窗口的标题中显示当前正在编辑的文件名
(可选)其他你觉得实用的功能:如支持word等
(可选)将其改造成MDI程序:父窗口中包含新建、窗口、帮助等菜单;在运行时,子窗口的菜单会与其合并,合理设置各菜单项的MergeIndex/MergeAction属性,使其符合我们的使用习惯;编程允许用户调整各自窗口间的布局关系(平铺、层叠等)等
先看效果
解决方法
richtextbox
用richtextbox是一个类似写字板的一个控件,能满足rtf,txt等格式,如果要满足doc文档,去百度Microsoft.Office.Interop.Word.dll,下载并引用,打开保存代码如下(其中saveName为文件名)
/// <summary>
/// 打开文档 *** 作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 打开OToolStripMenuItem_Click(object sender, EventArgs e)
{
openFileDialog1.InitialDirectory = "C:\\"
openFileDialog1.Filter = "rtf 文件|*.rtf|txt 文件|*.txt|doc files|*.doc"
if (openFileDialog1.ShowDialog() != DialogResult.OK)
return
saveName = openFileDialog1.FileName
if (openFileDialog1.FilterIndex == 1)
richTextBox1.LoadFile(saveName)
else if (openFileDialog1.FilterIndex == 2)
richTextBox1.LoadFile(saveName, RichTextBoxStreamType.PlainText)
else
OpenWord(saveName)
Text = saveName
}
public void 父窗体打开Open(WritingBoard writingBoard)
{
writingBoard.openFileDialog1.InitialDirectory = "C:\\"
writingBoard.openFileDialog1.Filter = "rtf 文件|*.rtf|txt 文件|*.txt|doc files|*.doc"
if (writingBoard.openFileDialog1.ShowDialog() != DialogResult.OK)
return
saveName = writingBoard.openFileDialog1.FileName
if (writingBoard.openFileDialog1.FilterIndex == 1)
writingBoard.richTextBox1.LoadFile(saveName)
else if (writingBoard.openFileDialog1.FilterIndex == 2)
writingBoard.richTextBox1.LoadFile(saveName, RichTextBoxStreamType.PlainText)
else
OpenWord(saveName)
writingBoard.Text = saveName
return
}
public void OpenWord(string fileName)
{
ApplicationClass applicationClass = new ApplicationClass()
Document document = null
object obj = Missing.Value
object FileName = fileName
object ReadOnly = false
object Visible = true
try
{
document = applicationClass.Documents.Open(ref FileName, ref obj, ref ReadOnly, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref Visible, ref obj, ref obj, ref obj, ref obj)
document.ActiveWindow.Selection.WholeStory()
document.ActiveWindow.Selection.Copy()
richTextBox1.Paste()
}
finally
{
document?.Close(ref obj, ref obj, ref obj)
applicationClass?.Quit(ref obj, ref obj, ref obj)
}
}
/// <summary>
/// 保存 *** 作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)
{
if (saveName != "")
{
richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText)
}
else
{
saveFileDialog1.Filter = "rtf files|*.rtf"
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
saveName = saveFileDialog1.FileName
richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText)
}
}
}
/// <summary>
/// 另存为 *** 作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)
{
saveFileDialog1.FileName = saveName.Substring(saveName.LastIndexOf('\\') + 1)
saveFileDialog1.Filter = "rtf files|*.rtf|txt files|*.txt|doc files|*.doc"
saveFileDialog1.AddExtension = true
if (saveFileDialog1.ShowDialog() != DialogResult.OK)
return
saveName = saveFileDialog1.FileName
if (saveFileDialog1.FilterIndex == 1)
richTextBox1.SaveFile(saveName, RichTextBoxStreamType.RichText)
else if (saveFileDialog1.FilterIndex == 2)
richTextBox1.SaveFile(saveName, RichTextBoxStreamType.PlainText)
else
SaveAsWord(saveName)
}
public void SaveAsWord(string fileName)
{
ApplicationClass applicationClass = new ApplicationClass()
Document document = null
object obj = Missing.Value
object FileName = fileName
try
{
document = applicationClass.Documents.Add(ref obj, ref obj, ref obj, ref obj)
document.ActiveWindow.Selection.WholeStory()
richTextBox1.SelectAll()
Clipboard.SetData(DataFormats.Rtf, richTextBox1.SelectedRtf)
document.ActiveWindow.Selection.Paste()
document.SaveAs(ref FileName, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj, ref obj)
}
finally
{
document?.Close(ref obj, ref obj, ref obj)
applicationClass?.Quit(ref obj, ref obj, ref obj)
}
}
/// <summary>
/// 新建 *** 作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 新建NToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox1.Clear()
saveName = ""
}
复制
写字板 *** 作设置
其他一系列doc加粗,倾斜,下划线,左中右对齐,字体型号颜色,查找(大小写,全字,正逆),其实本质上来说都是对richtextbox的一些属性的修改,注意多用DropDownOpening,DropDownItemClicked等 *** 作代替Click,使代码更加精简高效
这是一个MDI调整子窗体使用DropDownItemClicked的例子,高效优雅 = v =
private void 窗口WToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
string layout=e.ClickedItem.Text
switch(layout)
{
case "水平平铺": LayoutMdi(MdiLayout.TileHorizontal)break
case "垂直平铺": LayoutMdi(MdiLayout.TileVertical)break
case "层叠": LayoutMdi(MdiLayout.Cascade)break
}
}
复制
MDI的使用,是为了让一个父窗体拥有许多个子窗体,进行更加简单有效的 *** 作
在父窗体new子窗体就行,记得一系列基本 *** 作,你也可以通过生成函数和属性进行快速高效设置
private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
{
WritingBoard writingBoard = new WritingBoard()
writingBoard.TopLevel = false
writingBoard.MdiParent = this
writingBoard.Show()
}
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
WritingBoard writingBoard = new WritingBoard()
writingBoard.TopLevel = false
writingBoard.MdiParent = this
writingBoard.父窗体打开Open(writingBoard)
writingBoard.Show()
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (WritingBoard writingBoard in MdiChildren) writingBoard.Close()
Application.Exit()
}
private void 窗口WToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
string layout=e.ClickedItem.Text
switch(layout)
{
case "水平平铺": LayoutMdi(MdiLayout.TileHorizontal)break
case "垂直平铺": LayoutMdi(MdiLayout.TileVertical)break
case "层叠": LayoutMdi(MdiLayout.Cascade)break
}
}
复制
源码附上
传送门,我设置了分支,这样我就可以把不同内容相同属性的代码放在一起了,同时也可以拥有不同的md可以阅读,对于git 的整理也是不错的(`・ω・´)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154565.html原文链接:https://javaforall.cn
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客
复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
展开阅读全文
WindowshttpsJava网络安全
文章来自专栏
全栈程序员必看
55.1K 篇文章210 人关注
订阅
评论 (0)
写评论
暂无人发表评论
相关文章
《windows程序设计》_windows窗口程序设计
TEXTMETRIC类型的变量用于存储装置字体结构信息(上述变量),在窗口中输出文字时需要用到上述变量。
Windows程序设计——画圆[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170966.html原文链接:https://javaforall.cn
windows程序设计第五版_windows程序设计入门
函数功能:该函数用于画一个椭圆,椭圆的中心是限定矩形的中心,使用当前画笔画椭圆,用当前的画刷填充椭圆。
Windows程序设计学习笔记(一)Windows内存管理初步
学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流...
windows程序设计第五版_windows程序开发
[声明] HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor)[说明] 用指定的样式...
【读书笔记】Windows程序设计5
与从BeginPaint函数返回的设备句柄不同,从GetDC返回的设备句柄中的裁剪区域是整个客户区,而不仅仅
Windows程序设计:MFC 、Winform 和 WPF 比较[通俗易懂]
WinForm封装了win32的api,多次进行P/invoke *** 作(大部分使用p/invoke *** 作封装),速度慢。
Windows程序设计——窗口键盘消息滚动事件[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171006.html原文链接:https://javaforall.cn
什么是WPF_windows程序设计教程
(1)字参数(wParam) (2)长参数(lParam) 字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的...
createfont函数_windows程序设计基于.net平台
cHeight是字体的高度。 cWidth是字体的宽度。 cEscapement是字体的倾斜角。 cOrientation是字体的倾斜角。 cWeigh...
Windows程序设计——LoadImage参数及其用法「建议收藏」
函数功能:该函数装载图标,光标,或位图。 函数原型: HANDLE LoadImage ( HINSTANCE hinst, LPCTSTR lpsz...
微信小程序写字板功能
windows文件在另一程序打开_windows程序设计第7版
参数可选值: SW_HIDE = 0{隐藏, 并且任务栏也没有最小化图标} SW_SHOWNORMAL = 1{用最近的大小和位置显示, 激活} ...
windows程序设计第五版_程序设计中三种基本结构
WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。也就是说,Cr...
用vb.net实现写字板程序报告(二)
用vb.net实现写字板程序报告(二) –by zigz(LuHai) luluhai@eastd
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)